萌新刚学树剖,样例未过求助
查看原帖
萌新刚学树剖,样例未过求助
407604
Griseo_nya楼主2021/1/6 16:39
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=5e5+4;
struct bian{
	int bef,to;
}edge[2*maxn+1];
int size[maxn+1];
int n,num,m,tp[maxn+1],idnum,head[maxn+1],deep[maxn+1],zson[maxn+1],father[maxn+1],id[maxn+1];
void dfs1(int x,int fa,int d){
	deep[x]=d;
	size[x]=1;
	int zon=-1;
	father[x]=fa;
	for(int i=head[x];i!=0;i=edge[i].bef){
		int qwq=edge[i].to;
		if(qwq==fa)continue;
		dfs1(qwq,x,d+1);
		size[x]+=size[qwq];
		if(size[qwq]>zon){
			zson[x]=qwq;
			zon=size[qwq];
		}
	}
}
void dfs2(int x,int topp){
	id[x]=++idnum;
	tp[x]=topp;
	if(zson[x]){
		dfs2(zson[x],topp);
		for(int i=head[x];i!=0;i=edge[i].bef){
			int u=edge[i].to;
			if(!id[u])
			dfs2(u,u);
	}
	}
}
void addedge(int u,int v){
	edge[++num].to=v;
	edge[num].bef=head[u];
	head[u]=num;
}
struct tre{
	int l,r,w,siz,tag;
}shu[4*maxn+1];
void build(int k,int l,int r){
	shu[k].l=l;
	shu[k].r=r;
	shu[k].siz=r-l+1;
	shu[k].tag=-1;
	shu[k].w=0;
	if(l==r){
		return;
	}
	int mid=(l+r)/2;
	build(k*2,l,mid);
	build(k*2+1,mid+1,r);
//	cout<<k<<' '<<l<<' '<<r<<endl;
} 
void push(int k){
	if(shu[k].tag==-1)return;
		shu[k*2].w=(shu[k*2].siz)*shu[k].tag;
    	shu[k*2+1].w=(shu[k*2+1].siz)*shu[k].tag;
    	shu[k*2].tag=shu[k].tag;
    	shu[k*2+1].tag=shu[k].tag;
    	shu[k].tag=-1;
}
void gai(int k,int l,int r,int qwq){
	if(l<=shu[k].l&&r>=shu[k].r){
		shu[k].w=shu[k].siz*qwq;
        shu[k].tag=qwq;
//        cout<<"i gaile"<<k<<' '<<l<<' '<<r<<endl;
        return;
	}
	push(k);
	int mid=(shu[k].l+shu[k].r)/2;
	if(l<=mid)gai(k*2,l,r,qwq);
	if(r>mid)gai(k*2+1,l,r,qwq);
	shu[k].w=shu[k*2].w+shu[k*2+1].w;
}

void t0(int a,int b){
	while(tp[a]!=tp[b]){
		if(deep[tp[a]]<deep[tp[b]])swap(a,b);
		gai(1,id[tp[a]],id[a],1);
		a=father[tp[a]];
	}
	if(deep[a]>deep[b])swap(b,a);
	gai(1,id[a],id[b],1);
}

#undef int
int main(){
	#define int long long
	#ifndef ONLINE_JUDGE
	freopen("1.txt","r",stdin);
	#endif
	scanf("%lld",&n);
	
	for(int i=2;i<=n;i++){
		int y;
		scanf("%lld",&y);
		y++;
		addedge(i,y);
		addedge(y,i);
//		cout<<i<<' '<<y<<endl;
	}
	dfs1(1,0,1);
	dfs2(1,1);
	build(1,1,n);
	scanf("%lld",&m);
	const string un="uninstall";
	const string in="install";
//	for(int i=1;i<=n;i++){
//		cout<<id[i]<<' ';
//	}
//	cout<<endl;
	for(int i=1;i<=m;i++){
		int a;
		string s;
		char op[11];
		scanf("%s%lld",op,&a);
		s=op;
		a++;
		if(s==in){
			int qaq=shu[1].w; 
			t0(1,id[a]);
			printf("%lld\n",shu[1].w-qaq);
//			cout<<qaq<<endl;
//			cout<<shu[1].w<<endl;
		}
		else if(s==un){
			int qaq=shu[1].w;
			gai(1,id[a],id[a]+size[a]-1,0);
			printf("%lld\n",qaq-shu[1].w);
//			cout<<qaq<<endl;
//			cout<<shu[1].w<<endl;
		}
		
	}
	return 0;
}
2021/1/6 16:39
加载中...