萌新刚学树剖,只对了一个点
查看原帖
萌新刚学树剖,只对了一个点
362238
mattinas楼主2021/4/3 16:44
#include<bits/stdc++.h>
using namespace std;
struct node
{
	int l,r,lc,rc,d;
};node trn[200010];
struct tree
{
	int dfn,fa,top,dep,son,size;
};tree tr[100010];
struct edge
{
	int x,y,next;
};edge e[100010];
inline int read()
{
	register int x=0,f=1;
	char c=getchar();
	while(c>'9'||c<'0')
	{
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c<='9'&&c>='0')
	{
		x=(x<<3)+(x<<1)+(c^48);
		c=getchar();
	}
	return x*f;
}
int n,q,u,v;
int len1=0;
int last[100010];
void ins(int x,int y)
{
	len1++;
	e[len1]={x,y,last[x]};
	last[x]=len1;
}
int len2=0;
int bt(int l,int r)
{
	len2++;
	int now=len2;
	int lc=-1,rc=-1,d=0;
	if(l==r)
	{
		if(l==1)d=1;
	}
	else
	{
		int mid=(l+r)/2;
		lc=bt(l,mid);
		rc=bt(mid+1,r);
		d=max(trn[lc].d,trn[rc].d);
	}
	trn[now]={l,r,lc,rc,d};
	return now;
}
void dfs1(int x)
{
	tr[x].size=1;
	for(int i=last[x];i;i=e[i].next)
	{
		int y=e[i].y;
		if(!tr[y].size)
		{
			dfs1(y);
			tr[x].size+=tr[y].size;
			if(tr[x].son==-1||tr[tr[x].son].size<tr[y].size)	
				tr[x].son=y;
		}
	}
}
int cnt=0;
void dfs2(int x,int f,int top)
{
	cnt++;
	tr[x].fa=f;
	tr[x].dep=tr[f].dep+1;
	tr[x].dfn=cnt;
	tr[x].top=top;
	if(tr[x].son==0)return;
	dfs2(tr[x].son,x,top);
	for(int i=last[x];i;i=e[i].next)
	{
		int y=e[i].y;
		if(y!=tr[x].son&&y!=tr[x].fa)
		{
			dfs2(y,x,y);
		}
	}
}
void change(int now,int x)
{
	int lc=trn[now].lc,rc=trn[now].rc;
	int l=trn[now].l,r=trn[now].r;
	if(l==r)
	{
		trn[now].d=x;
	}
	else
	{
		int mid=(l+r)/2;
		if(x<=mid)change(lc,x);
		else change(rc,x);
		trn[now].d=max(trn[lc].d,trn[rc].d);
	}
}
int findmax(int now,int x,int y)
{
	int lc=trn[now].lc,rc=trn[now].rc;
	int l=trn[now].l,r=trn[now].r;
	if(l==x&&r==y)
	{
		return trn[now].d;
	}
	else
	{
		int mid=(l+r)/2;
		if(y<=mid)return findmax(lc,x,y);
		else if(x>mid)return findmax(rc,x,y);
		else
		{
			return max(findmax(lc,x,mid),findmax(rc,mid+1,y));
		}
	}
}
int Ans(int x)
{
	int ans=0;
	while(tr[x].top!=1)
	{
		ans=findmax(1,tr[tr[x].top].dfn,tr[x].dfn);
		if(ans!=0)return ans;
		x=tr[tr[x].top].fa;
	}
	ans=findmax(1,1,tr[x].dfn);
	return ans;
}
int main()
{
	n=read();
	q=read();
	for(int i=1;i<n;i++)
	{
		u=read();
		v=read();
		ins(u,v);
	}
	char op[3];
	dfs1(1);
	dfs2(1,1,1);
	bt(1,n);
	while(q--)
	{
		scanf("%s",op);
		u=read();
		if(op[0]=='C')
			change(1,tr[u].dfn);
		else printf("%d\n",Ans(u));
	} 
	return 0;
}
2021/4/3 16:44
加载中...