1180: [CROATIAN2009]OTOCI

Time Limit: 50 Sec  Memory Limit: 162 MB
Submit: 961  Solved: 594
[Submit][Status][Discuss]

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操作对应的输出,每个一行。


单点修改,链查询.....

貌似我还没写过splay的单点修改,好像只要修改t[x].w就可以了

链查询就是M A s得到x到y的链的Splay然后t[y].sum行了

注意:单点修改后别忘splay一下,这时候Access无所谓

Access的时候一定要更新,因为重新设置了rc嘛!!!!

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define pa t[x].fa
#define lc t[x].ch[0]
#define rc t[x].ch[1]
const int N=3e4+5;
inline int read(){char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}
struct node{int ch[2],fa,rev;int sum,w;
}t[N];
inline void update(int x){t[x].sum=t[lc].sum+t[rc].sum+t[x].w;}
inline int wh(int x){return t[pa].ch[1]==x;}
inline int isRoot(int x){return t[pa].ch[0]!=x&&t[pa].ch[1]!=x;}
inline void pushDown(int x){if(t[x].rev){t[lc].rev^=1;t[rc].rev^=1;swap(lc,rc);t[x].rev=0;}
}
inline void rotate(int x){int f=t[x].fa,g=t[f].fa,c=wh(x);if(!isRoot(f)) t[g].ch[wh(f)]=x;t[x].fa=g;t[f].ch[c]=t[x].ch[c^1];t[t[f].ch[c]].fa=f;t[x].ch[c^1]=f;t[f].fa=x;update(f);update(x);
}
int st[N],top;
inline void splay(int x){top=0;st[++top]=x;for(int i=x;!isRoot(i);i=t[i].fa) st[++top]=t[i].fa;for(int i=top;i>=1;i--) pushDown(st[i]);for(;!isRoot(x);rotate(x))if(!isRoot(pa)) rotate(wh(x)==wh(pa)?pa:x);
}inline void Access(int x){for(int y=0;x;y=x,x=pa){splay(x);rc=y;update(x);}
}
inline void MakeRoot(int x){Access(x);splay(x);t[x].rev^=1;
}
inline int FindRoot(int x){Access(x);splay(x);while(lc) x=lc;return x;
}
inline void Link(int x,int y){MakeRoot(x);t[x].fa=y;splay(x);
}int n,Q,x,y;
char s[N];
int main(){//freopen("in.txt","r",stdin);n=read();for(int i=1;i<=n;i++) t[i].w=t[i].sum=read();Q=read();while(Q--){scanf("%s",s);x=read();y=read();if(s[0]=='b'){if(FindRoot(x)==FindRoot(y)) puts("no");else puts("yes"),Link(x,y);}else if(s[0]=='p'){t[x].w=y;//Access(x);
            splay(x);}else{if(FindRoot(x)!=FindRoot(y)) puts("impossible");else{MakeRoot(x);Access(y);splay(y);printf("%d\n",t[y].sum);}}}
}

BZOJ 1180: [CROATIAN2009]OTOCI [LCT]相关推荐

  1. BZOJ 3091 城市旅行 (LCT)

    3091: 城市旅行 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 2251  Solved: 761 [Submit][Status][Discu ...

  2. bzoj 3881 [Coci2015]Divljak——LCT维护parent树链并

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3881 对 S 建 SAM ,每个 T 会让 S 的 parent 树的链并答案+1:在 T ...

  3. bzoj1180: [CROATIAN2009]OTOCI

    题目大意:询问两点是否连通(反人类的是连通输no,不联通输yes...),单点权值修改,路径和. 思路:正常的动态树,搞搞就行了. #include<cstdio> #include< ...

  4. [bzoj] 2049 洞穴勘探 || LCT

    原题 这是一道LCT的板子题. 至于LCT--link cut tree,也叫动态树,用splay实现动态连边的树. 预备知识: 实边:一个非叶节点,向它的儿子中的一个连一条特殊的边,称为实边;该非叶 ...

  5. bzoj 2959: 长跑(LCT+并查集)

    2959: 长跑 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 315  Solved: 178 [Submit][Status][Discuss] ...

  6. BZOJ1180 [CROATIAN2009]OTOCI

    裸LCT.. 不知为何单旋splay比双旋快.... #include <iostream> #include <cstdio> #include <algorithm& ...

  7. BZOJ 4530 大融合 LCT维护子树信息

    题意: N<=1e5个点,Q<=1e5个操作. 支持加一条边(u,v)(保证图是森林).询问经过边(u,v)的简单路径条数(保证(u,v)存在). 分析: 数据结构学傻了的我,表示并不会用 ...

  8. BZOJ 3779 重组病毒 LCT,树链剖分,线段树

    题意: 给一棵树,每个点一开始颜色互不相同,支持三个操作                 1. 将一个点到根的路径染成一种新的颜色                 2. 将一个新的点设为根,并将原来的 ...

  9. BZOJ 3091: 城市旅行 LCT

    这个合并还是相当复杂的. code: #include <cstdio> #include <cstring> #include <string> #include ...

最新文章

  1. 国外AI教学网红网站
  2. 【Python初级】009-错误与异常
  3. 【C 语言】指针间接赋值 ( 间接赋值三要素 | 间接赋值 使用的三种场景 )
  4. 【JDBC】实现对JDBC 连接的简单封装
  5. 计算机组成要素五:虚拟机 堆栈模型
  6. 具有Spring Boot和数据功能的Java头优先弹性搜索
  7. 终于读完Code complete 2nd edtion
  8. 揪出MySQL磁盘消耗迅猛的真凶
  9. web前端学习之HTML
  10. 中国结肠镜设备行业市场供需与战略研究报告
  11. 密文恢复出明文的过程称为_整流二极管的反向恢复过程图解
  12. Qt将QString转换成ASCII码
  13. Bash : 冒泡排序
  14. Sublime Text 收藏笔记
  15. Eclipse代码自动提示设置
  16. html怎么设置用户登录界面设计,html怎么做用户登录界面设计步骤,登录界面设计这样做?...
  17. 掌握bandicam以及KMPlayer
  18. win10 ISO文件下载
  19. 求一个图中的最大团(全连通分量) n = 40 (中途相遇法)
  20. CSDN浏览器助手又双叒叕更新啦,来体验下都更新了什么

热门文章

  1. TURBOMAIL反垃圾邮件清洁工,还你一个清爽的邮箱
  2. 微信支付JSAPI掉不起来支付按钮是什么原因?(原创)
  3. jQuery通过event获取点击事件的事件对象
  4. Vue的computed(计算属性)使用实例之TodoList
  5. [Android] charles高级使用总结
  6. 超酷jQuery进度条加载动画集合
  7. CSS3属性 box-shadow
  8. 关于LINUX权限的一个题目
  9. 再谈初学者关心的ssh应用方方面面
  10. 初步学习Django-第一篇:创建项目