呜呜树剖模板40分求助(卡了2小时了呜呜)
查看原帖
呜呜树剖模板40分求助(卡了2小时了呜呜)
299810
issue_is_fw楼主2020/10/1 23:24

呜呜不知道哪里错了...

明明记得很熟的啊.....

#include <bits/stdc++.h>
using namespace std;
const int maxn=8e6+10;
#define ls (rt<<1)
#define rs (rt<<1|1)
#define mid (l+r>>1)
#define lson ls,l,mid
#define rson rs,mid+1,r
const int inf=1e9;
struct edge{
	int to,nxt;
}d[maxn]; int head[maxn],cnt=1;
void add(int u,int v){
	d[++cnt] = (edge){v,head[u]},head[u]=cnt;
}
int n,m;
int fa[maxn],siz[maxn],deep[maxn],son[maxn];
int top[maxn],id[maxn],a[maxn],w[maxn],num,laz[maxn];
void dfs1(int u,int ff)
{
	fa[u]=ff,siz[u]=1,deep[u]=deep[ff]+1;
	for(int i=head[u];i;i=d[i].nxt )
	{
		int v=d[i].to;
		if( v==ff )	continue;
		dfs1(v,u);
		siz[u]+=siz[v];
		if( siz[son[u]]<siz[v] )	son[u]=v;
	}
}
void dfs2(int u,int ffa)
{
	top[u]=ffa,id[u]=++num;
	if( son[u] )	dfs2(son[u],ffa);
	for(int i=head[u];i;i=d[i].nxt )
	{
		int v=d[i].to;
		if( v==fa[u]||v==son[u] )	continue;
		dfs2(v,v);
	}
}
void push_down(int rt,int l,int r)
{
	laz[ls]+=laz[rt], laz[rs]+=laz[rt];
	a[ls]+=laz[rt]*(mid-l+1), a[rs]+=laz[rt]*(r-mid);
	laz[rt]=0;	
}
void insert(int rt,int l,int r,int L,int R,int val)
{
	if( l>=L&&r<=R ){ a[rt]+=val*(r-l+1),laz[rt]+=val; return; }
	if( r<L||l>R )	return;
	push_down(rt,l,r);
	insert(lson,L,R,val); insert(rson,L,R,val);
	a[rt] = a[ls]+a[rs];
}
int query(int rt,int l,int r,int L,int R)
{
	if( l>=L&&r<=R )	return a[rt];
	if( r<L||l>R )	return 0;
	push_down(rt,l,r);
	return query(lson,L,R)+query(rson,L,R);
}
void make(int l,int r,int val)
{
	while( top[l]!=top[r] )
	{
		if( deep[top[l]]<deep[top[r]] )	swap(l,r);
		insert(1,1,n,id[top[l]],id[l],val);
		l=fa[top[l]];
	}
	if( deep[id[l]]>deep[id[r]] )	swap(l,r);
	insert(1,1,n,id[l],id[r],val);	
	insert(1,1,n,id[l],id[l],-val);
}
struct ll{
	int l,r;
}k[maxn]; int kn;
int main()
{
	cin >> n >> m;
	for(int i=1;i<n;i++)
	{
		int l,r; scanf("%d%d",&l,&r);
		add(l,r); add(r,l);
	}
	dfs1(1,0); dfs2(1,1);
	while( m-- )
	{
		char c; int l,r;
		cin >> c;
		if( c=='Q' )
		{
			cin >> l >> r;
			int ans=0;
			while( top[l]!=top[r] )
			{
				if( deep[top[l]]<deep[top[r]] )	swap(l,r);
				ans+=query(1,1,n,id[top[l]],id[l]);
				l=fa[top[l]];
			}
			if( deep[id[l]]>deep[id[r]] )	swap(l,r);
			ans+=query(1,1,n,id[l],id[r]);
			ans-=query(1,1,n,id[l],id[l]);
			if( ans!=0 )	printf("No\n");
			else	printf("Yes\n");
		}
		else if( c=='C' )
		{
			cin >> l >> r;
			k[++kn].l=l,k[kn].r=r;
			make(l,r,1);	
		}
		else
		{
			cin >> l;
			r=k[l].r,l=k[l].l;
			make(l,r,-1);	
		}
	}
}
2020/10/1 23:24
加载中...