BZOJ3282: Tree

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ3282: Tree相关的知识,希望对你有一定的参考价值。

传送门

又是权限题= =,过了NOIp我就要去当一只权限狗!

 

LCT裸题,get到了两个小姿势。

1.LCA操作应该在access中随时updata

2.Link操作可以更简单

void Link(int noda,int nodb){Reverse(noda);t[noda].fa=nodb;}

 

技术分享
  1 //BZOJ 3282
  2 //by Cydiater
  3 //2016.9.16
  4 #include <iostream>
  5 #include <cstdio>
  6 #include <cstring>
  7 #include <algorithm>
  8 #include <queue>
  9 #include <map>
 10 #include <ctime>
 11 #include <cmath>
 12 #include <iomanip>
 13 #include <cstdlib>
 14 #include <string>
 15 using namespace std;
 16 #define ll long long
 17 #define up(i,j,n)        for(int i=j;i<=n;i++)
 18 #define down(i,j,n)        for(int i=j;i>=n;i--)
 19 const int MAXN=1e6+5;
 20 const int oo=0x3f3f3f3f;
 21 inline int read(){
 22     char ch=getchar();int x=0,f=1;
 23     while(ch>9||ch<0){if(ch==-)f=-1;ch=getchar();}
 24     while(ch>=0&&ch<=9){x=x*10+ch-0;ch=getchar();}
 25     return x*f;
 26 }
 27 int N,M,op,nodea,nodeb,node,num,q[MAXN],top=0;
 28 struct Tree{
 29     int son[2],v,Xor,fa,tag;
 30 }t[MAXN];
 31 namespace solution{
 32     inline bool get(int node){return t[t[node].fa].son[1]==node;}
 33     inline bool isroot(int node){return t[t[node].fa].son[1]!=node&&t[t[node].fa].son[0]!=node;}
 34     inline void updata(int node){
 35         if(node){
 36             t[node].Xor=t[node].v;
 37             if(t[node].son[0])t[node].Xor^=t[t[node].son[0]].Xor;
 38             if(t[node].son[1])t[node].Xor^=t[t[node].son[1]].Xor;
 39         }
 40     }
 41     inline void downit(int node){
 42         if(t[node].tag){
 43             t[t[node].son[0]].tag^=1;t[t[node].son[1]].tag^=1;
 44             swap(t[node].son[1],t[node].son[0]);
 45             t[node].tag=0;
 46         }
 47     }
 48     void rotate(int node){
 49         int old=t[node].fa,oldf=t[old].fa,which=get(node);
 50         if(!isroot(old))t[oldf].son[t[oldf].son[1]==old]=node;
 51         t[old].son[which]=t[node].son[which^1];t[t[old].son[which]].fa=old;
 52         t[node].son[which^1]=old;t[old].fa=node;t[node].fa=oldf;
 53         updata(old);updata(node);
 54     }
 55     void splay(int node){
 56         top=0;q[++top]=node;
 57         for(int i=node;!isroot(i);i=t[i].fa)q[++top]=t[i].fa;
 58         down(i,top,1)downit(q[i]);
 59         while(!isroot(node)){
 60             int old=t[node].fa,oldf=t[old].fa;
 61             if(!isroot(old))rotate(get(node)==get(old)?old:node);
 62             rotate(node);
 63         }
 64     }
 65     void access(int node){
 66         int tmp=0;
 67         while(node){
 68             splay(node);
 69             t[node].son[1]=tmp;
 70             updata(node);tmp=node;
 71             node=t[node].fa;
 72         }
 73     }
 74     void Reverse(int node){access(node);splay(node);t[node].tag^=1;}
 75     void Link(int noda,int nodb){Reverse(noda);t[noda].fa=nodb;}
 76     void Cut(int noda,int nodb){Reverse(noda);access(nodb);splay(nodb);if(t[nodb].son[0]==nodea)t[nodb].son[0]=t[noda].fa=0;}
 77     void LCA(int noda,int nodb){Reverse(nodb);access(noda);splay(noda);}
 78     int find(int node){
 79         access(node);splay(node);
 80         int tmp=node;
 81         while(t[tmp].son[0])tmp=t[tmp].son[0];
 82         return tmp;
 83     }
 84     void change(int node,int num){
 85         access(node);splay(node);//down lazy_tag
 86         t[node].v=num;updata(node);
 87     }
 88     //Link-Cut-Tree
 89     void init(){
 90         N=read();M=read();
 91         up(i,1,N){
 92             t[i].v=read();
 93             t[i].son[0]=t[i].son[1]=0;
 94             t[i].Xor=t[i].v;t[i].fa=0;
 95         }
 96     }
 97     void slove(){
 98         while(M--){
 99             op=read();
100             if(op==0){
101                 nodea=read();nodeb=read();
102                 LCA(nodea,nodeb);printf("%d\n",t[nodea].Xor);
103             }
104             if(op==1){
105                 nodea=read();nodeb=read();
106                 if(find(nodea)==find(nodeb))continue;
107                 Link(nodea,nodeb);
108             }
109             if(op==2){
110                 nodea=read();nodeb=read();
111                 if(find(nodea)!=find(nodeb))continue;
112                 Cut(nodea,nodeb);
113             }
114             if(op==3){
115                 node=read();num=read();
116                 change(node,num);
117             }
118         }
119     }
120 }
121 int main(){
122     //freopen("input.in","r",stdin);
123     using namespace solution;
124     init();
125     slove();
126     return 0;
127 }
View Code

 

以上是关于BZOJ3282: Tree的主要内容,如果未能解决你的问题,请参考以下文章

bzoj 3282: Tree

BZOJ 3282: Tree

BZOJ 3282Tree Link Cut Tree模板题

BZOJ 3282: Tree [LCT]

[BZOJ3282]Tree(LCT)

BZOJ3282: Tree