10pts 求助
查看原帖
10pts 求助
490484
include13_fAKe楼主2024/7/11 18:07
#include<bits/stdc++.h>
using namespace std;

const int maxn=10*114514;
struct Edge{
	int to;
	int nxt;
}edge[maxn];
struct segment_tree{
	int l;
	int r;
	int tag;	//1为true 2为false  
	int num;
}tree[4*maxn];
int head[maxn];
int idx;
int n,q;
void add(int u,int v){
//	cout<<u<<' '<<v<<endl;
	idx++;
	edge[idx].to=v;
	edge[idx].nxt=head[u];
	head[u]=idx;
}
int dep[maxn];	//深度 
int son[maxn];	//重儿子
int fa[maxn];	//父亲
int rank_[maxn];//在线段树中的排名

int time_stamp=-1;
int dfn[maxn];	//时间戳
int siz[maxn];	//子树大小
int top[maxn];	//链的顶端 
void dfs1(int u,int fa_){
//	cout<<u<<' '<<fa_<<endl;
	int max_siz=0;
	if(u!=0)	dep[u]=dep[fa_]+1;
	siz[u]=1;
	for(int i=head[u];i;i=edge[i].nxt){
		int v=edge[i].to;
//		cout<<v<<' '<<endl;
		dfs1(v,u);
		siz[u]+=siz[v];
		if(siz[v]>=max_siz){
			max_siz=siz[v];
			son[u]=v;
		}
	}
}
void dfs2(int u,int top_){
//	cout<<u<<' '<<top_<<endl;
	top[u]=top_;
	time_stamp++;
	dfn[u]=time_stamp;
	if(son[u])	dfs2(son[u],top_);
	for(int i=head[u];i;i=edge[i].nxt){
		int v=edge[i].to;
		if(v==son[u])	continue;
		dfs2(v,v);
	}
	return;
}
int length_(int id){
	return tree[id].r-tree[id].l+1;
}
void pushup(int id){
	tree[id].num=tree[id*2].num+tree[id*2+1].num; 
}
void pushdown(int id){
	if(tree[id].tag==1){
		tree[id*2].tag=1;
		tree[id*2].num=length_(id*2);
		tree[id*2+1].tag=1;
		tree[id*2+1].num=length_(id*2+1);
		tree[id].tag=0; 
	}
	if(tree[id].tag==2){
		tree[id*2].tag=2;
		tree[id*2].num=0;
		tree[id*2+1].tag=2;
		tree[id*2+1].num=0;
		tree[id].tag=0; 
	}
	return;
}
void build(int id,int l,int r){
	tree[id].l=l;
	tree[id].r=r;
	if(l==r){
		tree[id].num=0;
		return;
	}
	int mid=l+r>>1;
	build(id*2,l,mid);
	build(id*2+1,mid+1,r);
	pushup(id);
}
void modify(int id,int l,int r,int f){
//	cout<<id<<' '<<l<<' '<<r<<endl;
	int l1=tree[id].l;
	int r1=tree[id].r;
	if(l1>=l&&r1<=r){
//		cout<<' '<<l1<<' '<<r1<<' '<<f<<endl;
		tree[id].tag=f;
		tree[id].num=(f%2)*length_(id);
		return;
	}
	if(r<l1)	return;
	if(l>r1)	return;
	if(l1!=r1)	pushdown(id);
	int mid=l1+r1>>1;
	if(l<=mid)	modify(id*2,l,r,f);
	if(r>mid)	modify(id*2+1,l,r,f);
	pushup(id);
}
void modify1(int x,int y,bool f){
	while(top[x]!=top[y]){
		int x_=top[x];
		int y_=top[y];
		if(dep[x]<dep[y]){
			swap(x,y);
			swap(x_,y_);
		}
//		cout<<x_<<' '<<x<<endl;
		modify(1,dfn[x_],dfn[x],f);
		x=fa[x_];
	}
	if(dep[x]>dep[y]){
		swap(x,y); 
	}
//	cout<<dfn[x]<<' '<<dfn[y]<<endl;
	modify(1,dfn[x],dfn[y],f);
	return;
}
void modify2(int x,int f){
	int x_=rank_[x]+siz[x]-1;
	modify(1,rank_[x],x_,f);
	return;
}
int query(int id,int l,int r){
	int l1=tree[id].l;
	int r1=tree[id].r;
	if(l1>=l&&r1<=r){
//		cout<<l1<<' '<<r1<<' '<<tree[id].num<<endl;
		return tree[id].num;
	}
	if(l1!=r1)	pushdown(id);
	int mid=l1+r1>>1;
	int ans=0;
	if(l<=mid)	ans+=query(id*2,l,r);
	if(r>mid)	ans+=query(id*2+1,l,r);
	pushup(id);
	return ans;
}
int last_ans=0;
int main(){
	scanf("%d",&n);
	fa[0]=-1;
	for(int i=1;i<n;i++){
		int v;
		scanf("%d",&v);
		add(v,i);
		fa[i]=v;
	}
	dep[0]=1;
	dfs1(0,-1);
	dfs2(0,0);
//	for(int i=0;i<n;i++){
//		printf("%d %d %d %d %d %d %d\n",i,dep[i],son[i],fa[i],dfn[i],siz[i],top[i]);
//	}
	for(int i=0;i<n;i++){
		rank_[dfn[i]]=i;
	}
	build(1,0,n-1);
//	for(int i=0;i<n;i++){
//		cout<<rank_[i]<<' ';
//	}
//	cout<<endl;
	scanf("%d",&q);
	while(q--){
		char s[105];
		scanf("%s",s);
		switch(s[0]){
			case 'i':{
				int x;
				scanf("%d",&x);
//				puts("@");
				modify1(0,x,1);
				break;
			}
			default:{
				int x;
				scanf("%d",&x);
//				puts("#");
				modify2(x,2);
				break;
			}
		}
		int now=query(1,0,n-1);
		printf("%d\n",abs(now-last_ans));
		last_ans=now;
	}
	return 0;
} 
2024/7/11 18:07
加载中...