zoukankan      html  css  js  c++  java
  • 【BZOJ2049,2631,3282,1180】LCT模板四连A

    好吧我并不想讲LCT

    只是贴4个代码~

    【BZOJ2049】[Sdoi2008]Cave 洞穴勘测

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #define isr(A)	(s[s[A].fa].ch[0]!=A&&s[s[A].fa].ch[1]!=A)
    using namespace std;
    const int maxn=10010;
    int n,m;
    struct NODE
    {
    	int ch[2],fa,rev;
    	
    }s[10010];
    char str[20];
    void pushdown(int x)
    {
    	if(s[x].rev)
    	{
    		swap(s[x].ch[0],s[x].ch[1]);
    		if(s[x].ch[0])	s[s[x].ch[0]].rev^=1;
    		if(s[x].ch[1])	s[s[x].ch[1]].rev^=1;
    		s[x].rev=0;
    	}
    }
    void rotate(int x)
    {
    	int y=s[x].fa,z=s[y].fa,d=(x==s[y].ch[1]);
    	if(!isr(y))	s[z].ch[y==s[z].ch[1]]=x;
    	s[y].ch[d]=s[x].ch[d^1],s[y].fa=x,s[x].fa=z;
    	if(s[x].ch[d^1])	s[s[x].ch[d^1]].fa=y;
    	s[x].ch[d^1]=y;
    }
    void pd(int x){if(!isr(x))	pd(s[x].fa);	pushdown(x);}
    void splay(int x)
    {
    	pd(x);
    	while(!isr(x))
    	{
    		int y=s[x].fa,z=s[y].fa;
    		if(!isr(y))
    		{
    			if((x==s[y].ch[1])^(y==s[z].ch[1]))	rotate(x);
    			else	rotate(y);
    		}
    		rotate(x);
    	}
    }
    void access(int x)
    {
    	int y=0;
    	while(x)	splay(x),s[x].ch[1]=y,y=x,x=s[x].fa;
    }
    void maker(int x)
    {
    	access(x),splay(x),s[x].rev^=1;
    }
    int findr(int x)
    {
    	access(x),splay(x);
    	while(s[x].ch[0])	pushdown(x),x=s[x].ch[0];
    	return x;
    }
    void link(int x,int y)
    {
    	maker(x),s[x].fa=y;
    }
    void cut(int x,int y)
    {
    	maker(y),access(x),splay(x);
    	s[x].ch[0]=s[y].fa=0;
    }
    int rd()
    {
    	int ret=0;	char gc=getchar();
    	while(gc<'0'||gc>'9')	gc=getchar();
    	while(gc>='0'&&gc<='9')	ret=ret*10+gc-'0',gc=getchar();
    	return ret;
    }
    int main()
    {
    	n=rd(),m=rd();
    	int i,a,b;
    	for(i=1;i<=m;i++)
    	{
    		scanf("%s",str);
    		a=rd(),b=rd();
    		switch(str[0])
    		{
    			case 'D':cut(a,b);	break;
    			case 'C':link(a,b);	break;
    			case 'Q':if(findr(a)==findr(b))	printf("Yes
    ");
    			else	printf("No
    ");
    		}
    	}
    	return 0;
    }

    【BZOJ2631】tree

    此题的下传标记实在是长,好在我把它写到结构体里了

    据说此题必须用unsigned int,不明觉厉~

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #define isr(A)	(s[s[A].fa].ch[0]!=A&&s[s[A].fa].ch[1]!=A)
    #define mod 51061
    using namespace std;
    typedef unsigned int ui;
    struct node
    {
    	ui ch[2],fa,rev;
    	ui ts,tc,sum,siz,v;
    	void C(ui x)	{v=v*x%mod,sum=sum*x%mod,tc=tc*x%mod,ts=ts*x%mod;}
    	void S(ui x)	{v=(v+x)%mod,sum=(sum+siz*x)%mod,ts=(ts+x)%mod;}
    }s[100010];
    char str[10];
    ui n,m;
    void pushup(ui x)
    {
    	s[x].siz=s[s[x].ch[0]].siz+s[s[x].ch[1]].siz+1;
    	s[x].sum=(s[s[x].ch[0]].sum+s[s[x].ch[1]].sum+s[x].v)%mod;
    }
    void pushdown(ui x)
    {
    	if(s[x].rev)
    	{
    		swap(s[x].ch[0],s[x].ch[1]);
    		if(s[x].ch[0])	s[s[x].ch[0]].rev^=1;
    		if(s[x].ch[1])	s[s[x].ch[1]].rev^=1;
    		s[x].rev=0;
    	}
    	if(s[x].tc!=1)
    	{
    		if(s[x].ch[0])	s[s[x].ch[0]].C(s[x].tc);
    		if(s[x].ch[1])	s[s[x].ch[1]].C(s[x].tc);
    		s[x].tc=1;
    	}
    	if(s[x].ts)
    	{
    		if(s[x].ch[0])	s[s[x].ch[0]].S(s[x].ts);
    		if(s[x].ch[1])	s[s[x].ch[1]].S(s[x].ts);
    		s[x].ts=0;
    	}
    }
    void rotate(ui x)
    {
    	ui y=s[x].fa,z=s[y].fa,d=(x==s[y].ch[1]);
    	if(!isr(y))	s[z].ch[y==s[z].ch[1]]=x;
    	s[y].ch[d]=s[x].ch[d^1],s[x].fa=z,s[y].fa=x;
    	if(s[x].ch[d^1])	s[s[x].ch[d^1]].fa=y;
    	s[x].ch[d^1]=y;
    	pushup(y),pushup(x);
    }
    void updata(ui x)
    {
    	if(!isr(x))	updata(s[x].fa);
    	pushdown(x);
    }
    void splay(ui x)
    {
    	updata(x);
    	while(!isr(x))
    	{
    		ui y=s[x].fa,z=s[y].fa;
    		if(!isr(y))
    		{
    			if((x==s[y].ch[0])^(y==s[z].ch[0]))	rotate(x);
    			else	rotate(y);
    		}
    		rotate(x);
    	}
    }
    void access(ui x)
    {
    	ui y=0;
    	while(x)	splay(x),s[x].ch[1]=y,pushup(x),y=x,x=s[x].fa;
    }
    void maker(ui x)
    {
    	access(x),splay(x),s[x].rev^=1;
    }
    void cut(ui x,ui y)
    {
    	maker(y),access(x),splay(x);
    	s[x].ch[0]=s[y].fa=0,pushup(x);
    }
    void link(ui x,ui y)
    {
    	maker(y),s[y].fa=x;
    }
    ui rd()
    {
    	ui ret=0;	char gc=getchar();
    	while(gc<'0'||gc>'9')	gc=getchar();
    	while(gc>='0'&&gc<='9')	ret=ret*10+gc-'0',gc=getchar();
    	return ret;
    }
    int main()
    {
    	n=rd(),m=rd();
    	ui i,a,b,c,d;
    	for(i=1;i<=n;i++)	s[i].v=1;
    	for(i=1;i<n;i++)	link(rd(),rd());
    	for(i=1;i<=m;i++)
    	{
    		scanf("%s",str),a=rd(),b=rd();
    		switch(str[0])
    		{
    			case '*':c=rd(),maker(a),access(b),splay(b),s[b].C(c);	break;
    			case '+':c=rd(),maker(a),access(b),splay(b),s[b].S(c);	break;
    			case '-':c=rd(),d=rd(),cut(a,b),link(c,d);	break;
    			case '/':maker(a),access(b),splay(b),printf("%u
    ",s[b].sum);	break;
    		}
    	}
    	return 0;
    }

    【BZOJ3282】Tree

    判断一下是否联通就好了

    #include <cstdio>
    #include <iostream>
    #include <cstring>
    #define isr(A)	(s[s[A].fa].ch[0]!=A&&s[s[A].fa].ch[1]!=A)
    using namespace std;
    int n,m;
    struct node
    {
    	int ch[2],fa,sum,v,rev;
    }s[300010];
    void pushup(int x)
    {
    	s[x].sum=s[s[x].ch[0]].sum^s[s[x].ch[1]].sum^s[x].v;
    }
    void pushdown(int x)
    {
    	if(s[x].rev)
    	{
    		swap(s[x].ch[0],s[x].ch[1]);
    		if(s[x].ch[0])	s[s[x].ch[0]].rev^=1;
    		if(s[x].ch[1])	s[s[x].ch[1]].rev^=1;
    		s[x].rev=0;
    	}
    }
    void rotate(int x)
    {
    	int y=s[x].fa,z=s[y].fa,d=(x==s[y].ch[1]);
    	if(!isr(y))	s[z].ch[y==s[z].ch[1]]=x;
    	s[x].fa=z,s[y].fa=x,s[y].ch[d]=s[x].ch[d^1];
    	if(s[x].ch[d^1])	s[s[x].ch[d^1]].fa=y;
    	s[x].ch[d^1]=y;
    	pushup(y),pushup(x);
    }
    void updata(int x)
    {
    	if(!isr(x))	updata(s[x].fa);
    	pushdown(x);
    }
    void splay(int x)
    {
    	updata(x);
    	while(!isr(x))
    	{
    		int y=s[x].fa,z=s[y].fa;
    		if(!isr(y))
    		{
    			if((x==s[y].ch[0])^(y==s[z].ch[0]))	rotate(x);
    			else	rotate(y);
    		}
    		rotate(x);
    	}
    }
    void access(int x)
    {
    	int y=0;
    	while(x)	splay(x),s[x].ch[1]=y,pushup(x),y=x,x=s[x].fa;
    }
    void maker(int x)
    {
    	access(x),splay(x),s[x].rev^=1;
    }
    void cut(int x,int y)
    {
    	maker(x),access(y),splay(y);
    	if(s[x].fa==y)	s[x].fa=s[y].ch[0]=0,pushup(y);
    }
    void link(int x,int y)
    {
    	maker(x),s[x].fa=y;
    }
    void split(int a,int b)
    {
    	maker(a),access(b),splay(b);
    }
    int findr(int x)
    {
    	access(x),splay(x);
    	while(s[x].ch[0])	x=s[x].ch[0];
    	return x;
    }
    int rd()
    {
    	int ret=0;	char gc=getchar();
    	while(gc<'0'||gc>'9')	gc=getchar();
    	while(gc>='0'&&gc<='9')	ret=ret*10+gc-'0',gc=getchar();
    	return ret;
    }
    int main()
    {
    	n=rd(),m=rd();
    	int i,a,b,c;
    	for(i=1;i<=n;i++)	s[i].sum=s[i].v=rd();
    	for(i=1;i<=m;i++)
    	{
    		c=rd(),a=rd(),b=rd();
    		switch(c)
    		{
    			case 0:split(a,b),printf("%d
    ",s[b].sum);	break;
    			case 1:if(findr(a)!=findr(b))	link(a,b);	break;
    			case 2:cut(a,b);	break;
    			case 3:splay(a),s[a].v=b,pushup(a);	break;
    		}
    	}
    	return 0;
    }

    [CROATIAN2009]OTOCI

    我经常把ch[]数组开成int ch[0];不知道有谁跟我经常犯一样的错误。。。

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #define isr(A)	(s[s[A].fa].ch[0]!=A&&s[s[A].fa].ch[1]!=A)
    using namespace std;
    int n,m;
    struct node
    {
    	int ch[2],fa,sum,v,rev;
    }s[30010];
    char str[20];
    void pushup(int x)
    {
    	s[x].sum=s[s[x].ch[0]].sum+s[s[x].ch[1]].sum+s[x].v;
    }
    void pushdown(int x)
    {
    	if(s[x].rev)
    	{
    		swap(s[x].ch[0],s[x].ch[1]);
    		if(s[x].ch[0])	s[s[x].ch[0]].rev^=1;
    		if(s[x].ch[1])	s[s[x].ch[1]].rev^=1;
    		s[x].rev=0;
    	}
    }
    void rotate(int x)
    {
    	int y=s[x].fa,z=s[y].fa,d=(x==s[y].ch[1]);
    	if(!isr(y))	s[z].ch[y==s[z].ch[1]]=x;
    	s[y].fa=x,s[x].fa=z,s[y].ch[d]=s[x].ch[d^1];
    	if(s[x].ch[d^1])	s[s[x].ch[d^1]].fa=y;
    	s[x].ch[d^1]=y;
    	pushup(y),pushup(x);
    }
    void updata(int x)
    {
    	if(!isr(x))	updata(s[x].fa);
    	pushdown(x);
    }
    void splay(int x)
    {
    	updata(x);
    	while(!isr(x))
    	{
    		int y=s[x].fa,z=s[y].fa;
    		if(!isr(y))
    		{
    			if((x==s[y].ch[0])^(y==s[z].ch[0]))	rotate(x);
    			else	rotate(y);
    		}
    		rotate(x);
    	}
    }
    void access(int x)
    {
    	int y=0;
    	while(x)	splay(x),s[x].ch[1]=y,pushup(x),y=x,x=s[x].fa;
    }
    void maker(int x)
    {
    	access(x),splay(x),s[x].rev^=1;
    }
    void link(int x,int y)
    {
    	maker(x),s[x].fa=y;
    }
    int findr(int x)
    {
    	access(x),splay(x);
    	while(s[x].ch[0])	x=s[x].ch[0];
    	return x;
    }
    void split(int x,int y)
    {
    	maker(y),access(x),splay(x);
    }
    int rd()
    {
    	int ret=0;	char gc=getchar();
    	while(gc<'0'||gc>'9')	gc=getchar();
    	while(gc>='0'&&gc<='9')	ret=ret*10+gc-'0',gc=getchar();
    	return ret;
    }
    int main()
    {
    	n=rd();
    	int i,a,b,c;
    	for(i=1;i<=n;i++)	s[i].sum=s[i].v=rd();
    	m=rd();
    	for(i=1;i<=m;i++)
    	{
    		scanf("%s",str),a=rd(),b=rd();
    		switch(str[0])
    		{
    			case 'b':if(findr(a)!=findr(b))	printf("yes
    "),link(a,b);
    					else	printf("no
    ");	break;
    			case 'p':splay(a),s[a].v=b,pushup(a);	break;
    			case 'e':if(findr(a)!=findr(b))	printf("impossible
    ");
    					else	split(a,b),printf("%d
    ",s[a].sum);	break;
    		}
    	}
    	return 0;
    }
  • 相关阅读:
    《算法导论》读书笔记--第三章函数的增长 课后题
    《利用python进行数据分析》读书笔记--第五章 pandas入门
    《利用python进行数据分析》读书笔记--第四章 numpy基础:数组和矢量计算
    《利用python进行数据分析》读书笔记--第三章 ipython使用
    《算法导论》读书笔记--第三章 函数的增长
    《利用python进行数据分析》读书笔记 --第一、二章 准备与例子
    《R语言实战》读书笔记--学习张丹日志
    《R语言实战》读书笔记 第七章--基本统计分析
    解决Mybatis-plus高版本不向后兼容的问题
    【Javascript】: for循环中定义的变量在for循环体外也有效
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/6795572.html
Copyright © 2011-2022 走看看