zoukankan      html  css  js  c++  java
  • 【bzoj3282】Tree

    LCT模板题;

    话说xor和的意思是所有数xor一下;

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<cstdlib>
    #include<ctime>
    #include<algorithm>
    using namespace std;
    #define mid ((l+r)>>1)
    #define LL long long
    #define FILE "dealing"
    #define up(i,j,n) for(LL i=(j);i<=(n);i++)
    #define pii pair<int,int>
    int read(){
    	int x=0,f=1,ch=getchar();
    	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    	while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
    	return f*x;
    }
    const int maxn=306000,inf=100000000,mod=998244353;
    int n,m,cnt;
    int c[maxn][2],fa[maxn],rev[maxn],w[maxn],v[maxn],sum[maxn];
    void reve(int x){rev[x]^=1,swap(c[x][0],c[x][1]);}
    void updata(int x){sum[x]=sum[c[x][1]]^sum[c[x][0]]^v[x];}
    void pushdown(int x){if(rev[x])rev[x]^=1,reve(c[x][1]),reve(c[x][0]);}
    bool isroot(int x){return c[fa[x]][1]!=x&&c[fa[x]][0]!=x;}
    void rotate(int x){
    	int y=fa[x],z=fa[y],d=c[y][1]==x;
    	if(!isroot(y))c[z][c[z][1]==y]=x;
    	fa[y]=x,fa[x]=z,fa[c[x][d^1]]=y;
    	c[y][d]=c[x][d^1],c[x][d^1]=y;
    	updata(y);updata(x);
    }
    int q[maxn],top=0;
    void splay(int x){
    	q[++top]=x;
    	for(int i=x;!isroot(i);i=fa[i])q[++top]=fa[i];
    	while(top)pushdown(q[top--]);
    	while(!isroot(x)){
    		int y=fa[x],z=fa[y];
    		if(!isroot(y))
    			if(c[y][1]==x^c[z][1]==y)rotate(x);
    			else rotate(y);
    		rotate(x);
    	}
    }
    void access(int x){for(int t=0;x;t=x,x=fa[x])splay(x),c[x][1]=t,updata(x);}
    void makeroot(int x){access(x);splay(x);reve(x);}
    void link(int x,int y){makeroot(x);fa[x]=y;}
    void cut(int x,int y){makeroot(x);access(y);splay(y);if(c[y][0]==x)fa[x]=c[y][0]=0;}
    int main(){
    	freopen(FILE".in","r",stdin);
    	freopen(FILE".out","w",stdout);
    	n=read(),m=read();cnt=n;
    	up(i,1,n)sum[i]=v[i]=read();
    	int ch,x,y;
    	while(m--){
    		ch=read(),x=read(),y=read();
    		if(ch==0){
    			makeroot(x),access(y),splay(y);
    			printf("%d
    ",sum[y]);
    		}
    		if(ch==1){
    			makeroot(x);access(y);splay(y);
    			int t=y;while(c[t][0])t=c[t][0];
    			if(t!=x)link(x,y);
    		}
    		if(ch==2)cut(x,y);
    		if(ch==3){makeroot(x);v[x]=y;updata(x);}
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    复制构造函数
    c++运算符优先级
    std::condition_variable(二)
    std::condition_variable
    std::unique_lock
    std::lock_guard
    Oracle 11gR2 11.2.0.1 ( 11.2.0.1的BUG?):ohasd不能正常启动:ioctl操作:npohasd的问题:【chmod a+wr /var/tmp/.oracle/npohasd】
    bat、cmd、dos窗口:后台调用,不显示黑色的控制台dos(命令行)窗口
    Ubuntu 安装 Oracle11gR2:'install' of makefile '/home/oracle/app/oracle/product/11.2.0/dbhome_1/ctx/lib/ins_ctx.mk'
    Ubuntu 10.04 安装 Oracle11gR2
  • 原文地址:https://www.cnblogs.com/chadinblog/p/6337541.html
Copyright © 2011-2022 走看看