luogu IDE 输出0 ,本地样例输出正常qaq
查看原帖
luogu IDE 输出0 ,本地样例输出正常qaq
542905
WannaYellow楼主2022/7/13 08:22
#include<iostream>
using namespace std;
//--------Fast I/O-----
int read(){
	int re=0;
	char t=getchar();
	while(t<'0'||t>'9')t=getchar();
	while(t>='0'&&t<='9')re=re*10+(t^48),t=getchar();
	return re;
}
void write(int x){
	if(x<10)putchar(x+'0');
	else write(x/10),putchar(x%10+'0');
}
void writeln(int x){
	write(x);
	putchar('\n');
}
//--------END-----------
int n,q;
int myabs(int x){return x>0?x:-x;}
//----------Build Graph--------
struct EDGE{
	int to,next;
}e[200005];
int head[100005],cntedge;
void addedge(int u,int v){
	e[++cntedge].to=v;
	e[cntedge].next=head[u];
	head[u]=cntedge;
}
void daddedge(int u,int v){
	addedge(u,v);
	addedge(v,u);
}
//-----------END-------------
//------------树链剖分-----------
struct NODE{
	int size,h_son,fa,dep,id,top;
}nod[100005];
int cntid;
void dfs1(int f,int x){
	nod[x].size=1;
	nod[x].fa=f;
	nod[x].dep=nod[f].dep+1;
	for(int i=head[x];i;i=e[i].next){
		if(e[i].to==f)continue;
		dfs1(x,e[i].to);
		nod[x].size+=nod[e[i].to].size;
		if(nod[nod[x].h_son].size<nod[e[i].to].size){
			nod[x].h_son=e[i].to;
		}
	}
}
void dfs2(int top,int x){
	nod[x].top=top;
	nod[x].id=++cntid;
	if(nod[x].size==1)return;
	dfs2(top,nod[x].h_son);
	for(int i=head[x];i;i=e[i].next){
		if(e[i].to==nod[x].fa||e[i].to==nod[x].h_son)continue;
		dfs2(e[i].to,e[i].to);
	}
}
//--------------END----------
//----------线段树-------------
#define mid ((l+r)>>1)
struct SEGTREE{
	int a[100005<<2],t[100005<<2];
	int ls(int x){return x<<1;}
	int rs(int x){return x<<1|1;}
	void update(int x){
		a[x]=a[ls(x)]+a[rs(x)];
	}
	void build(int x,int l,int r){
		if(l==r){
			a[x]=0;
			return;
		}
		build(ls(x),l,mid);
		build(rs(x),mid+1,r);
		update(x);
	}
	void add(int x,int l,int r,int k){
		if(k==1){
			a[x]=r-l+1;
			t[x]=1;
		}
		else if(k==2){
			a[x]=0;
			t[x]=2;
		}
	}
	void push_down(int x,int l,int r){
		if(t[x]!=0){
			add(ls(x),l,mid,t[x]);
			add(rs(x),mid+1,r,t[x]);
			t[x]=0;
		}
	}
	void modify(int x,int l,int r,int ml,int mr,int k){
		if(ml<=l&&r<=mr){
			add(x,l,r,k);
			return;
		}
		push_down(x,l,r);
		if(ml<=mid)modify(ls(x),l,mid,ml,mr,k);
		if(mr>mid)modify(rs(x),mid+1,r,ml,mr,k);
		update(x);
	}
	int query(int x,int l,int r,int ql,int qr){
		if(ql<=l&&r<=qr)return a[x];
		push_down(x,l,r);
		int re=0;
		if(ql<=mid)re+=query(ls(x),l,mid,ql,qr);
		if(qr>mid)re+=query(rs(x),mid+1,r,ql,qr);
		update(x);
		return re;
	}
	
}T; 
#ifdef mid
	#undef mid
#endif
//------------END----------
//---------操作----------
int query(int x){
	int re=0;
	while(nod[x].top!=1){
		re+=T.query(1,1,n,nod[nod[x].top].id,nod[x].id);
		x=nod[nod[x].top].fa;
	}
	re+=T.query(1,1,n,nod[1].id,nod[x].id);
	return re;
}
void modify(int x,int k){
	while(nod[x].top!=1){
		T.modify(1,1,n,nod[nod[x].top].id,nod[x].id,1);
		x=nod[nod[x].top].fa;
	}
	T.modify(1,1,n,nod[1].id,nod[x].id,1);
}
int install(int x){
	x+=1;
	int a=query(x);
	modify(x,1);
	int b=query(x);
	return myabs(a-b);	
} 
int uninstall(int x){
	x+=1;
	int a=T.query(1,1,n,nod[x].id,nod[x].id+nod[x].size-1);
	T.modify(1,1,n,nod[x].id,nod[x].id+nod[x].size-1,2);
	int b=T.query(1,1,n,nod[x].id,nod[x].id+nod[x].size-1);
	return myabs(a-b);
}
//-----------END------
int main(){
	n=read();
	for(int i=2;i<=n;i++){
		int t=read();
		t++;
		daddedge(i,t);
	}
	dfs1(0,1);
	dfs2(1,1);
	T.build(1,1,n);
	q=read();
	for(int i=1;i<=q;i++){
		char t=getchar();
		if(t=='i'){
			int x=read();
		//	cout<<"i\n";
			writeln(install(x));
		}
		else{
			int x=read();
		//	cout<<"u\n";
			writeln(uninstall(x));
		}
	}
	return 0;
}
2022/7/13 08:22
加载中...