BZOJ_1180_[CROATIAN2009]OTOCI_LCT

Description

给出n个结点以及每个点初始时对应的权值wi。起始时点与点之间没有连边。有3类操作: 
1、bridge A B:询问结点A与结点B是否连通。
如果是则输出“no”。否则输出“yes”,并且在结点A和结点B之间连一条无向边。 
2、penguins A X:将结点A对应的权值wA修改为X。 
3、excursion A B:如果结点A和结点B不连通,则输出“impossible”。
否则输出结点A到结点B的路径上的点对应的权值的和。
给出q个操作,要求在线处理所有操作。
数据范围:1<=n<=30000, 1<=q<=300000, 0<=wi<=1000。

Input

第一行包含一个整数n(1<=n<=30000),表示节点的数目。
第二行包含n个整数,第i个整数表示第i个节点初始时对应的权值。
第三行包含一个整数q(1<=n<=300000),表示操作的数目。
以下q行,每行包含一个操作,操作的类别见题目描述。
任意时刻每个节点对应的权值都是1到1000的整数。

Output

输出所有bridge操作和excursion操作对应的输出,每个一行。

Sample Input

5
4 2 4 5 6
10
excursion 1 1
excursion 1 2
bridge 1 2
excursion 1 2
bridge 3 4
bridge 3 5
excursion 4 5
bridge 1 3
excursion 2 4
excursion 2 5

Sample Output

4
impossible
yes
6
yes
yes
15
yes
15
16

 LCT维护点权和,支持单点修改。
注意bridge操作是连通输出‘no'
 
代码:
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <algorithm>
  4. using namespace std;
  5. #define N 30050
  6. #define ls ch[p][0]
  7. #define rs ch[p][1]
  8. #define get(x) (ch[f[x]][1]==x)
  9. int ch[N][2],f[N],rev[N],sum[N],val[N],n,m;
  10. char opt[20];
  11. inline bool isrt(int p) {
  12. return ch[f[p]][0]!=p&&ch[f[p]][1]!=p;
  13. }
  14. inline void pushdown(int p) {
  15. if(rev[p]) {
  16. swap(ch[ls][0],ch[ls][1]); swap(ch[rs][0],ch[rs][1]);
  17. rev[ls]^=1; rev[rs]^=1; rev[p]=0;
  18. }
  19. }
  20. inline void pushup(int p) {
  21. sum[p]=sum[ls]+sum[rs]+val[p];
  22. }
  23. void update(int p) {
  24. if(!isrt(p)) update(f[p]);
  25. pushdown(p);
  26. }
  27. void rotate(int x) {
  28. int y=f[x],z=f[y],k=get(x);
  29. if(!isrt(y)) ch[z][ch[z][1]==y]=x;
  30. ch[y][k]=ch[x][!k]; f[ch[y][k]]=y;
  31. ch[x][!k]=y; f[y]=x; f[x]=z;
  32. pushup(y); pushup(x);
  33. }
  34. void splay(int x) {
  35. update(x);
  36. for(int fa;fa=f[x],!isrt(x);rotate(x))
  37. if(!isrt(fa))
  38. rotate(get(fa)==get(x)?fa:x);
  39. }
  40. void access(int p) {
  41. int t=0;
  42. while(p) splay(p),rs=t,pushup(p),t=p,p=f[p];
  43. }
  44. void makeroot(int p) {
  45. access(p); splay(p); swap(ls,rs); rev[p]^=1;
  46. }
  47. void link(int x,int p) {
  48. makeroot(x); splay(p); f[x]=p;
  49. }
  50. void cut(int x,int p) {
  51. makeroot(x); access(p); splay(p); ls=f[x]=0;
  52. }
  53. int find(int p) {
  54. access(p); splay(p);
  55. while(ls) pushdown(p),p=ls;
  56. return p;
  57. }
  58. void fix(int p,int v) {
  59. access(p); splay(p); val[p]=v; pushup(p);
  60. }
  61. int main() {
  62. scanf("%d",&n);
  63. int i,x,y;
  64. for(i=1;i<=n;i++) scanf("%d",&val[i]);
  65. scanf("%d",&m);
  66. for(i=1;i<=m;i++) {
  67. scanf("%s%d%d",opt,&x,&y);
  68. if(opt[0]=='e') {
  69. int t1=find(x),t2=find(y);
  70. if(t1!=t2) {
  71. puts("impossible");
  72. }
  73. else {
  74. makeroot(x); access(y); splay(y);
  75. printf("%d\n",sum[y]);
  76. }
  77. }else if(opt[0]=='b') {
  78. int t1=find(x),t2=find(y);
  79. if(t1==t2) puts("no");
  80. else {
  81. puts("yes"); link(x,y);
  82. }
  83. }else {
  84. fix(x,y);
  85. }
  86. }
  87. }

BZOJ_1180_[CROATIAN2009]OTOCI_LCT的更多相关文章

  1. BZOJ_1180_[CROATIAN2009]_OTOCI_(LCT)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1180 三种操作: 1.询问x,y是否连通,如果不连通,建一条边x,y 2.把x节点的权值改为t ...

  2. [bzoj1180][CROATIAN2009]OTOCI_LCT

    OTOCI bzoj-1180 CROATIAN-2009 题目大意:给你n个离散的点,m个操作.支持:两点加边(保证还是森林),修改单点权值,询问两点是否联通,查询联通两点之间路径权值. 注释:$1 ...

  3. BZOJ 1180: [CROATIAN2009]OTOCI [LCT]

    1180: [CROATIAN2009]OTOCI Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 961  Solved: 594[Submit][S ...

  4. BZOJ 1180: [CROATIAN2009]OTOCI

    1180: [CROATIAN2009]OTOCI Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 989  Solved: 611[Submit][S ...

  5. 1180: [CROATIAN2009]OTOCI(LCT)

    1180: [CROATIAN2009]OTOCI Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 1200  Solved: 747[Submit][ ...

  6. 1180: [CROATIAN2009]OTOCI

    1180: [CROATIAN2009]OTOCI Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 1032  Solved: 638[Submit][ ...

  7. 【BZOJ1180】: [CROATIAN2009]OTOCI & 2843: 极地旅行社 LCT

    竟然卡了我....忘记在push_down先下传父亲的信息了....还有splay里for():卡了我10min,但是双倍经验还是挺爽的,什么都不用改. 感觉做的全是模板题,太水啦,不能这么水了... ...

  8. BZOJ1180: [CROATIAN2009]OTOCI

    传送门 一遍AC,开心! $Link-Cut-Tree$最后一题 //BZOJ 1180 //by Cydiater //2016.9.18 #include <iostream> #in ...

  9. bzoj1837: [CROATIAN2009]cavli 凸包1

    Description 给你N个点,请循环完成下列任务 1:求出这N个点的凸包的面积 2:拿掉最左或最右或最上或最下的一个点,当点的个数不足三个时停止 Input 第一行,一个数字N 接下来N行,每行 ...

随机推荐

  1. ios中block访问外部变量的一些注意点

    Block类型是一个C级别的语法和运行机制.它与标准的C函数类似,不同之处在于,它除了有可执行代码以外,它还包含了与堆.栈内存绑定的变量.因此,Block对象包含着一组状态数据,这些数据在程序执行时用 ...

  2. Effective Java 第三版——40. 始终使用Override注解

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  3. [Java算法分析与设计]--单向链表(List)的实现和应用

    单向链表与顺序表的区别在于单向链表的底层数据结构是节点块,而顺序表的底层数据结构是数组.节点块中除了保存该节点对应的数据之外,还保存这下一个节点的对象地址.这样整个结构就像一条链子,称之为" ...

  4. HTML学习笔记8:表单

      什么是表单?     一个网页表单可以将用户输入的数据发送到服务器进行处理.因为互联网用户使用复选框,单选按钮或文本字段填写表格,所以WebForms的形式类似文件或数据库.例如,WebForms ...

  5. Page_Load不要忘了if (!IsPostBack)

    Page_Load不要忘了if (!IsPostBack) 问题:在DropDownList的SelectedIndexChanged事件中绑定数据,运行时,DropDownList控件的Select ...

  6. python爬虫入门(三)XPATH和BeautifulSoup4

    XML和XPATH 用正则处理HTML文档很麻烦,我们可以先将 HTML文件 转换成 XML文档,然后用 XPath 查找 HTML 节点或元素. XML 指可扩展标记语言(EXtensible Ma ...

  7. NoHttp封装--03 缓存

    1.Default模式,也是没有设置缓存模式时的默认模式 这个模式实现http协议中的内容,比如响应码是304时,当然还会结合E-Tag和LastModify等头. StringRequest req ...

  8. VS2010+OpenCV3.4.1+zbar 64位

    1. OpenCV3.4.1和zbar文件夹放到指定的路径下,我把它们放在了"D:\二维码\环境"中. zbar:链接:https://pan.baidu.com/s/11eCDV ...

  9. C# Ioc、DI、Unity、TDD的一点想法和实践

    面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP). 依赖倒置原则(DIP):一种软件架构设计的原则(抽象概念) 控制反转( ...

  10. C++相关:C++的IO库

    前言 基本的IO库设施 istream(输入流类型),提供输入操作. ostream(输出流类型),提供输出操作. cin,一个istream对象,从标准输入读取数据. cout,一个ostream对 ...