蒟蒻刚学LCT,0pts 求助大佬
查看原帖
蒟蒻刚学LCT,0pts 求助大佬
752706
hyfzelda楼主2023/2/12 14:28

rt

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,q;
struct edge{
	int val,fa,son[2],res,size,cnt,lazy_mul,lazy_add;bool mark;
}a[2000005];
const int mod=51061;
#define lson(x) (a[x].son[0])
#define rson(x) (a[x].son[1])
#define fa(x) (a[x].fa)
#define check_son(x,f) (rson(f)==x)
#define connect(x,y,s) a[fa(x)=y].son[s]=x
#define push_up(x) a[x].res=(a[lson(x)].res+a[rson(x)].res+a[x].val)%mod,a[x].size=a[lson(x)].size+a[rson(x)].size+a[x].cnt
#define ntroot(x) (lson(fa(x))==x||rson(fa(x))==x)
#define reverse(x) swap(lson(x),rson(x)),a[x].mark^=1;
void push_down_add(int now)
{
	if(a[now].son[0]) 
	{
		a[a[now].son[0]].res+=a[now].lazy_add*a[a[now].son[0]].size,
		a[a[now].son[0]].val+=a[now].lazy_add*a[a[now].son[0]].size,
		a[a[now].son[0]].lazy_add+=a[now].lazy_add,
		a[a[now].son[0]].val%=mod;
		a[a[now].son[0]].lazy_add%=mod;
		a[a[now].son[0]].res%=mod;
	}
	if(a[now].son[1]) 
	{
		a[a[now].son[1]].res+=a[now].lazy_add*a[a[now].son[1]].size,
		a[a[now].son[1]].val+=a[now].lazy_add*a[a[now].son[1]].size,
		a[a[now].son[1]].lazy_add+=a[now].lazy_add,
		a[a[now].son[1]].val%=mod;
		a[a[now].son[1]].lazy_add%=mod;
		a[a[now].son[1]].res%=mod;
	}
	a[now].lazy_add=0;
}
void push_down_mul(int now)
{
	if(a[now].son[0]) 
	{
		a[a[now].son[0]].res*=a[now].lazy_mul,
		a[a[now].son[0]].val*=a[now].lazy_mul,
		a[a[now].son[0]].lazy_mul*=a[now].lazy_mul,
		a[a[now].son[0]].lazy_add*=a[a[now].son[0]].lazy_mul,
		a[a[now].son[0]].lazy_mul%=mod;
		a[a[now].son[0]].val%=mod;
		a[a[now].son[0]].lazy_add%=mod;
		a[a[now].son[0]].res%=mod;

	}	
	if(a[now].son[1]) 
	{
		a[a[now].son[1]].res*=a[now].lazy_mul,
		a[a[now].son[1]].val*=a[now].lazy_mul,
		a[a[now].son[1]].lazy_mul*=a[now].lazy_mul,
		a[a[now].son[1]].lazy_add*=a[a[now].son[1]].lazy_mul,
		a[a[now].son[1]].lazy_mul%=mod;
		a[a[now].son[1]].val%=mod;
		a[a[now].son[1]].lazy_add%=mod;
		a[a[now].son[1]].res%=mod;
	}
	a[now].lazy_mul=1;
}
	
void push_down(int x)
{
	if(a[x].lazy_mul!=1) push_down_mul(x);
	if(a[x].lazy_add!=0) push_down_add(x);
	if(a[x].mark)
	{
    	if(lson(x)) reverse(lson(x));
    	if(rson(x)) reverse(rson(x));
    	a[x].mark=0;
	}
}
void push_all(int x)
{
	if(ntroot(x)) push_all(fa(x));
	push_down(x); 
}
void rotate(int x)
{
    int y=fa(x),z=fa(y),tmp=check_son(x,y);
	connect(a[x].son[tmp^1],y,tmp);
	fa(x)=z;
	if(ntroot(y)) a[z].son[check_son(y,z)]=x;
	connect(y,x,tmp^1);
	push_up(y);push_up(x);
}
void splay(int x,int goal)
{
	push_all(x);
	while(ntroot(x))
    {
        int y=fa(x),z=fa(y);
        if(ntroot(y)) check_son(y,z)^check_son(x,y)?rotate(x):rotate(y);
        rotate(x);
    }push_up(x);
}
void access(int x)
{
	int tmp=0;
	while(x)
	{   
        splay(x,0);
        rson(x)=tmp;
        push_up(x);
        tmp=x,x=fa(x);
	}
}
void mkroot(int x)
{
	access(x);
    splay(x,0);
    reverse(x);      
}
int findroot(int x)
{
	access(x);
	splay(x,0);
	while(lson(x))
	{
		push_down(x);
		x=lson(x);
	}
//	splay(x,0);
	return x;
}
void link(int x,int y)
{
    mkroot(x);
  //  if(findroot(y)==x) return;
    fa(x)=y;
}
void cut(int x,int y)
{
	mkroot(x);
//	if(findroot(y)!=x||fa(y)!=x||lson(y)) return;
	fa(y)=rson(x)=0;
	push_up(x); 
}
void split(int x,int y)
{
    mkroot(x);
    access(y);
    splay(y,0);
}
signed main()
{
//	freopen("a.in","r",stdin);
	scanf("%lld%lld",&n,&q);
	for(int i=1;i<n;i++)
	{
		int x,y;
		scanf("%lld%lld",&x,&y);link(x,y);a[i].cnt=a[i].size=1;a[i].val=1,a[i].lazy_mul=1;
	}
	a[n].cnt=a[n].size=1;a[n].val=1,a[n].lazy_mul=1;
	char op[10];
	while(q--)
	{
		scanf("%s",op);int x,y,val;
		if(op[0]=='+')
		{
			scanf("%lld%lld%lld",&x,&y,&val);
			split(x,y);
			a[y].res+=a[y].size*val,a[y].lazy_add+=val,a[y].val+=val;
			a[y].val%=mod;a[y].lazy_add%=mod;a[y].res%=mod;
		}
		else if(op[0]=='-')
		{
			scanf("%lld%lld",&x,&y);cut(x,y);
			scanf("%lld%lld",&x,&y);link(x,y);
		}
		else if(op[0]=='*')
		{
			scanf("%lld%lld%lld",&x,&y,&val);
			split(x,y);
			a[y].res*=val,a[y].lazy_mul*=val,a[y].val*=val;
			a[y].val%=mod;a[y].lazy_mul%=mod;a[y].res%=mod;
		}
		else if(op[0]=='/')
		{
			scanf("%lld%lld",&x,&y);
			split(x,y);
			printf("%lld\n",a[y].res);
		}
	}
}
2023/2/12 14:28
加载中...