树剖求助
查看原帖
树剖求助
200116
dshzsh楼主2020/8/20 18:14
#include<bits/stdc++.h>
using namespace std;
const int maxn=3e5+10;
int aa[maxn];
struct rr{
	int le;
	int ri;
	int lazy;
};
rr tr[maxn*4];
struct ee{
	int to;
	int next;
};
ee bb[maxn*2];
int head[maxn],fa[maxn],cnt=0,tot=0;
int size[maxn],top[maxn],op[maxn],dep[maxn],dd[maxn];
void build(int rt,int le,int ri)
{
	tr[rt].le=le;tr[rt].ri=ri;
	tr[rt].lazy=0;
	if(le>=ri) return;
	//printf("%d:%d-%d\n",rt,tr[rt].le,tr[rt].ri);
	int mid=(le+ri)>>1;
	build(rt<<1,le,mid);
	build(rt<<1|1,mid+1,ri);
	return;
}
void down(int rt)
{
	int le=rt<<1,ri=rt<<1|1;
	tr[le].lazy+=tr[rt].lazy;
	tr[ri].lazy+=tr[rt].lazy;
	tr[rt].lazy=0;
}
void xgg(int le,int ri,int rt,int k)
{
	//cout<<rt<<endl;
	if(tr[rt].le>=le&&tr[rt].ri<=ri)
	{
		tr[rt].lazy+=k;
		return;
	}
	down(rt);
	int mid=(tr[rt].le+tr[rt].ri)>>1;
	//printf("%d %d %d\n",rt,tr[rt].le,tr[rt].ri);
	if(mid>=le)
		xgg(le,ri,rt<<1,k);
	if(mid<ri)
		xgg(le,ri,rt<<1|1,k);
}
int cxx(int x,int rt)
{
	if(tr[rt].le==x&&x==tr[rt].ri)
		return tr[rt].lazy;
	down(rt);
	int mid=(tr[rt].le+tr[rt].ri)>>1;
	if(mid>=x)
		return cxx(x,rt<<1);
	else
		return cxx(x,rt<<1|1);
}
void dfs(int x,int sd)
{
	int ma=0;
	size[x]=1;dd[x]=sd;
	for(int i=head[x];i;i=bb[i].next)
	{
		int sx=bb[i].to;
		if(sx!=fa[x])
		{
			dfs(sx,sd+1);
			if(size[sx]>ma) op[x]=sx,ma=size[sx];
			size[x]+=size[sx];
		}
	}
}
void xg(int x,int y,int k)
{
	while(top[x]!=top[y])
	{
		//cout<<x<<y<<endl;
		if(dd[top[x]]<dd[top[y]]) swap(x,y);
		xgg(dep[top[x]],dep[x],1,k);
		x=fa[top[x]];
	}
	
	if(dd[x]<dd[y])
        swap(x,y);
    xgg(dep[y],dep[x],1,k);
}
void dfs2(int x)
{
	if(x==op[fa[x]])
		top[x]=top[fa[x]];
	else top[x]=x;
	//cout<<x<<" "<<top[x]<<" "<<op[x]<<endl;
	dep[x]=++tot;
	if(op[x]) dfs2(op[x]);
	for(int i=head[x];i;i=bb[i].next)
	{
		int sx=bb[i].to;
		if(sx!=fa[x]&&sx!=op[x])
			dfs2(sx);
	}
}
void jb(int q,int z)
{
	bb[++cnt].to=z;
	bb[cnt].next=head[q];
	head[q]=cnt;
}
int main()
{
	//freopen("in","r",stdin);
	//freopen("out","w",stdout);
	int n;
	scanf("%d",&n);
	build(1,1,n);
	for(int i=1;i<=n;i++)
		scanf("%d",&aa[i]);
	fa[1]=1;
	for(int i=1;i<n;i++)
	{
		int a,b;
		if(a>b) swap(a,b);
		scanf("%d%d",&a,&b);
		fa[b]=a;
		jb(a,b);
	}
	dfs(1,1);
	dfs2(1);
	xg(aa[1],aa[1],1);
	for(int i=1;i<n;i++)
		xg(aa[i],aa[i+1],1),xg(aa[i],aa[i],-1);
	xg(aa[n],aa[n],-1);
	for(int i=1;i<=n;i++)
		printf("%d\n",cxx(dep[i],1));
	return 0;
}

WA劝退标题

2020/8/20 18:14
加载中...