昨天看了一天的lct。。当然幸好最后看懂了(也许吧。。)

论善良学长的重要性T_T,老司机带带我!

这题主要是删边的时候还要判断一下。。蒟蒻一开始天真的以为存在的边才能删结果吃了一发wa。。。

事实是只要两个点之间联通就能断开了,管它有没有边。。。。整个就一模板题。。

交上去后跑得很慢(记录类型的锅)。。但还是很短?(请自行无视过长变量名)

  1. #include<cstdio>
  2. #include<math.h>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. const int maxn=;
  7. struct zs{
  8. int c[],fa,val,sum;
  9. bool rev;
  10. }tree[maxn];
  11. int i,j,n,m,id,x,y;
  12. int stack[maxn];
  13. inline void update(int x){tree[x].sum=tree[tree[x].c[]].sum^tree[x].val^tree[tree[x].c[]].sum;
  14. }
  15. inline bool isroot(int x){return tree[tree[x].fa].c[]!=x&&tree[tree[x].fa].c[]!=x;
  16. }
  17. void rotate(int x){
  18. int fa=tree[x].fa,gfa=tree[fa].fa;
  19. if(!isroot(fa))tree[gfa].c[tree[gfa].c[]==fa]=x;
  20. int l=tree[fa].c[]==x,r=l^;
  21. tree[fa].c[l]=tree[x].c[r];tree[x].c[r]=fa;
  22. tree[fa].fa=x;tree[x].fa=gfa;tree[tree[fa].c[l]].fa=fa;
  23. update(fa);update(x);
  24. }
  25. void pushdown(int x){
  26. if(!tree[x].rev)return;
  27. int l=tree[x].c[],r=tree[x].c[];
  28. if(l)tree[l].rev^=;if(r)tree[r].rev^=;
  29. swap(tree[x].c[],tree[x].c[]);tree[x].rev^=;
  30. }
  31. void splay(int x){
  32. int top=,tmp=x;stack[++top]=x;
  33. while(!isroot(tmp))stack[++top]=tree[tmp].fa,tmp=tree[tmp].fa;
  34. while(top)pushdown(stack[top]),top--;
  35. int fa,gfa;
  36. while(!isroot(x)){
  37. fa=tree[x].fa,gfa=tree[fa].fa;
  38. if(!isroot(fa))
  39. if((tree[gfa].c[]==fa)^(tree[fa].c[]==x))rotate(x);
  40. else rotate(fa);
  41. rotate(x);
  42. }
  43. }
  44. void access(int x){
  45. int son=;
  46. while(x){
  47. splay(x);tree[x].c[]=son;
  48. update(x);
  49. son=x;x=tree[x].fa;
  50. }
  51. }
  52. void makeroot(int x){
  53. access(x);splay(x);tree[x].rev^=;
  54. }
  55. void link(int x,int y){
  56. makeroot(x);tree[x].fa=y;splay(x);
  57. }
  58. void cut(int x,int y){
  59. makeroot(x);access(y);splay(y);tree[y].c[]=tree[x].fa=;
  60. }
  61. int query(int x,int y){
  62. makeroot(x);access(y);splay(y);return tree[y].sum;
  63. }
  64. int getfa(int x){
  65. access(x);splay(x);while(tree[x].c[])pushdown(x),x=tree[x].c[];splay(x);
  66. return x;
  67. }
  68. void change(int x,int y){
  69. makeroot(x);tree[x].val=y;update(x);
  70. }
  71. int main(){
  72. scanf("%d%d",&n,&m);
  73. for(i=;i<=n;i++)scanf("%d",&tree[i].val),tree[i].sum=tree[i].val;
  74. while(m--){
  75. scanf("%d%d%d",&id,&x,&y);
  76. if(id==)printf("%d\n",query(x,y));
  77. else if(id==){if(getfa(x)!=getfa(y))link(x,y);}
  78. else if(id==){if(getfa(x)==getfa(y))cut(x,y);}
  79. else if(id==)change(x,y);
  80. }
  81. return ;
  82. }

b站上的lct怎么都是300大洋的世界。。

16.1.13:重写了一发

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. using namespace std;
  5. const int maxn=;
  6. int ch[maxn][],fa[maxn],sum[maxn],num[maxn],st[maxn];
  7. bool rev[maxn];
  8. int i,j,n,m,x,y;
  9.  
  10. int ra;char rx;
  11. inline int read(){
  12. rx=getchar(),ra=;
  13. while(rx<''||rx>'')rx=getchar();
  14. while(rx>=''&&rx<='')ra*=,ra+=rx-,rx=getchar();return ra;
  15. }
  16. char s[];
  17. inline void outx(int x){
  18. if(!x)putchar('');
  19. register int len=;
  20. while(x)s[++len]=x%,x/=;
  21. while(len)putchar(s[len--]+);putchar('\n');
  22. }
  23. inline bool isrt(int x){return ch[fa[x]][]!=x&&ch[fa[x]][]!=x;}
  24. inline void upd(int x){sum[x]=sum[ch[x][]]^num[x]^sum[ch[x][]];}
  25. inline void pushdown(int x){
  26. if(!rev[x])return;
  27. rev[x]=,swap(ch[x][],ch[x][]),rev[ch[x][]]^=,rev[ch[x][]]^=;
  28. }
  29. inline void rotate(int x){
  30. int f=fa[x],gfa=fa[f],l=ch[f][]==x,r=l^;
  31. if(!isrt(f))ch[gfa][ch[gfa][]==f]=x;
  32. fa[x]=gfa,fa[f]=x,ch[f][l]=ch[x][r],ch[x][r]=f,fa[ch[f][l]]=f;
  33. sum[x]=sum[f],upd(f);
  34. }
  35. void splay(int x){
  36. int f,gfa;
  37. for(st[st[]=]=f=x;!isrt(f);)st[++st[]]=(f=fa[f]);
  38. while(st[])pushdown(st[st[]--]);
  39. for(f=fa[x],gfa=fa[f];!isrt(x);rotate(x),f=fa[x],gfa=fa[f])
  40. if(!isrt(f))rotate(((ch[f][]==x)^(ch[gfa][]==f))?x:f);
  41. }
  42. inline void access(int x){
  43. for(int t=;x;t=x,x=fa[x])splay(x),ch[x][]=t,upd(x);
  44. }
  45. inline void makert(int x){
  46. access(x),splay(x),rev[x]^=;
  47. }
  48. void cut(int x,int y){
  49. makert(x),access(y),splay(y),ch[y][]=fa[x]=,upd(y);
  50. }
  51. void link(int x,int y){
  52. makert(x),fa[x]=y;if(!(x&))splay(x);
  53. }
  54. inline int query(int x,int y){
  55. makert(x),access(y),splay(y);
  56. return sum[y];
  57. }
  58. inline int getfa(int x){
  59. for(access(x),splay(x),pushdown(x);ch[x][];x=ch[x][]);
  60. return x;
  61. }
  62. inline void change(int x,int v){
  63. splay(x),num[x]=v,upd(x);
  64. }
  65. int main(){
  66. n=read(),m=read();
  67. for(i=;i<=n;i++)num[i]=read();int id;
  68. while(m--){
  69. id=read(),x=read(),y=read();
  70. if(id==)outx(query(x,y));
  71. if(id==)if(getfa(x)!=getfa(y))link(x,y);
  72. if(id==)if(getfa(x)==getfa(y))cut(x,y);
  73. if(id==)change(x,y);
  74. }
  75. return ;
  76. }

3282: Tree

Time Limit: 30 Sec  Memory Limit: 512 MB

Description

给定N个点以及每个点的权值,要你处理接下来的M个操作。操作有4种。操作从0到3编号。点从1到N编号。

0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和。保证x到y是联通的。

1:后接两个整数(x,y),代表连接x到y,若x到Y已经联通则无需连接。

2:后接两个整数(x,y),代表删除边(x,y),不保证边(x,y)存在。

3:后接两个整数(x,y),代表将点X上的权值变成Y。

Input

第1行两个整数,分别为N和M,代表点数和操作数。

第2行到第N+1行,每行一个整数,整数在[1,10^9]内,代表每个点的权值。

第N+2行到第N+M+1行,每行三个整数,分别代表操作类型和操作所需的量。

Output

对于每一个0号操作,你须输出X到Y的路径上点权的Xor和。

Sample Input

3 3
1
2
3
1 1 2
0 1 2
0 1 1
 

Sample Output

3
1
 

HINT

1<=N,M<=300000

[bzoj3282]Tree (lct)的更多相关文章

  1. BZOJ3282: Tree (LCT模板)

    Description 给定N个点以及每个点的权值,要你处理接下来的M个操作. 操作有4种.操作从0到3编号.点从1到N编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和 ...

  2. 【BZOJ3282】Tree LCT

    1A爽,感觉又对指针重怀信心了呢= =,模板题,注意单点修改时splay就好,其实按吾本意是没写的也A了,不过应该加上能更好维护平衡性. ..还是得加上好= = #include <iostre ...

  3. BZOJ3282: Tree

    传送门 又是权限题= =,过了NOIp我就要去当一只权限狗! LCT裸题,get到了两个小姿势. 1.LCA操作应该在access中随时updata 2.Link操作可以更简单 void Link(i ...

  4. BZOJ-3282 Tree Link-Cut-Tree(似乎树链剖分亦可)

    蛋蛋用链剖A的,我写的LCT 3282: Tree Time Limit: 30 Sec Memory Limit: 512 MB Submit: 1241 Solved: 542 [Submit][ ...

  5. HDU 5002 Tree LCT 区间更新

    Tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.action?c ...

  6. hdu5398 GCD Tree(lct)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud GCD Tree Time Limit: 5000/2500 MS (Java/O ...

  7. BZOJ 3282: Tree( LCT )

    LCT.. -------------------------------------------------------------------------------- #include<c ...

  8. BZOJ 2631: tree( LCT )

    LCT...略麻烦... -------------------------------------------------------------------------------- #inclu ...

  9. Link-Cut Tree(LCT)&TopTree讲解

    前言: Link-Cut Tree简称LCT是解决动态树问题的一种数据结构,可以说是我见过功能最强大的一种树上数据结构了.在此与大家分享一下LCT的学习笔记.提示:前置知识点需要树链剖分和splay. ...

随机推荐

  1. ios 中的循环引用问题及解决

    循环引用,指的是多个对象相互引用时,使得引用形成一个环形,导致外部无法真正是否掉这块环形内存.其实有点类似死锁. 举个例子:A->B->C->....->X->B   - ...

  2. springboot学习(一)——helloworld

    以下内容,如有问题,烦请指出,谢谢 springboot出来也很久了,以前零散地学习了不少,不过很长时间了都没有在实际中使用过了,忘了不少,因此要最近准备抽时间系统的学习积累下springboot,给 ...

  3. Linux服务器上的oracle数据导入和导出

    背景: 在同一台Linux服务器上,有两个数据库用户,分别为:database1,database2,如何把database1用户下面的所有的表和数据,导入到database2数据库(database ...

  4. FPGA设计思想与技巧(转载)

    题记:这个笔记不是特权同学自己整理的,特权同学只是对这个笔记做了一下完善,也忘了是从那DOWNLOAD来的,首先对整理者表示感谢.这些知识点确实都很实用,这些设计思想或者也可以说是经验吧,是很值得每一 ...

  5. Webpack 2 视频教程 008 - WDS 端口号等配置相关

    原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...

  6. JavaScript的DOM编程--07--节点的属性

    节点的属性: 1). nodeName: 代表当前节点的名字. 只读属性. 如果给定节点是一个文本节点, nodeName 属性将返回内容为 #text 的字符串 2). nodeType:返回一个整 ...

  7. popupwindow那些坑

    1. new PopupWindow(vw, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); 如果 ...

  8. 安卓和 java 学习笔记

    1.访问权限为 private 的成员变量或方法,需要执行setAccessible() 方法,并将入口参数设置为 true; 否则不允许访问. 2.为了保证线程的安全,可以使用同步块 synchro ...

  9. Head First设计模式之原型模式

    一.定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型模式是一种比较简单的模式,也非常容易理解,实现一个接口,重写一个方法即完成了原型模式.在实际应用中,原型模式很少单独出现 ...

  10. angular4.0项目main.ts详解

    main.ts负责引导整个angular应用的起点 // 导入enableProdMode用来关闭angular开发者模式 import { enableProdMode } from '@angul ...