0pts求调,已过样例
查看原帖
0pts求调,已过样例
117192
无产者万岁楼主2023/1/2 18:56
#include <bits/stdc++.h>
using namespace std;
vector<int>E[100001];
struct SegTree
{
	int Left,Right,Sum,Tag;
}Tree[400001];
int n,T;
int fa[100001],dep[100001],son[100001],siz[100001];
int cnt,id[100001],top[100001];
void push_up(int k)
{
	Tree[k].Sum=Tree[2*k].Sum+Tree[2*k+1].Sum;
}
void push_down(int k)
{
	if(Tree[k].Tag==-1) return;
	int l=Tree[k].Left,r=Tree[k].Right;
	int mid=(l+r)/2;
	Tree[2*k].Sum=(mid-l+1)*Tree[k].Tag;
	Tree[2*k+1].Sum=(r-mid)*Tree[k].Tag;
	Tree[2*k].Tag=Tree[2*k+1].Tag=Tree[k].Tag;
	Tree[k].Tag=-1;
}
void Build(int k,int l,int r)
{
	Tree[k].Left=l;
	Tree[k].Right=r;
	Tree[k].Tag=-1;
	if(l==r)
	{
		Tree[k].Sum=0;
		return;
	}
	int mid=(l+r)/2;
	Build(2*k,l,mid);
	Build(2*k+1,mid+1,r);
	push_up(k);
}
int Query(int k,int l,int r)
{
	if(Tree[k].Left>r||Tree[k].Right<l)
		return 0;
	if(Tree[k].Left>=l&&Tree[k].Right<=r)
		return Tree[k].Sum;
	push_down(k);
	return Query(2*k,l,r)+Query(2*k+1,l,r);
}
void Update(int k,int l,int r,int num)
{
	if(Tree[k].Left>r||Tree[k].Right<l)
		return;
	if(Tree[k].Left>=l&&Tree[k].Right<=r)
	{
		Tree[k].Sum=(Tree[k].Right-Tree[k].Left+1)*num;
		Tree[k].Tag=num;
		return;
	}
	push_down(k);
	Update(2*k,l,r,num);
	Update(2*k+1,l,r,num);
	push_up(k);
}
//以上是线段树部分 
void Dfs1(int u,int f)
{
	fa[u]=f;
	dep[u]=dep[f]+1;
	siz[u]=1;
	int maxn=-1;
	for(int i=0;i<E[u].size();i++)
	{
		int v=E[u][i];
		if(v==f) continue;
		Dfs1(v,u);
		siz[u]+=siz[v];
		if(siz[v]>maxn)
		{
			maxn=siz[v];
			son[u]=v;
		}
	}
}
void Dfs2(int u,int topf)
{
	id[u]=++cnt;
	top[u]=topf;
	if(son[u]==-1) return;
	Dfs2(son[u],topf);
	for(int i=0;i<E[u].size();i++)
	{
		int v=E[u][i];
		if(v==son[u]||v==fa[u]) continue;
		Dfs2(v,v); 
	}
}
void UpdateI(int x,int y)
{
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]])
			swap(x,y);
		Update(1,id[top[x]],id[x],1);
		x=fa[top[x]];
	}	
	if(dep[x]>dep[y])
		swap(x,y);
	Update(1,id[x],id[y],1);
} 
int QueryI(int x,int y)
{
	int ans=0;
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]])
			swap(x,y);
		ans+=Query(1,id[top[x]],id[top[y]]);
		x=fa[top[x]];	
	}
	if(dep[x]>dep[y])
		swap(x,y);
	ans+=Query(1,id[x],id[y]);
	return ans;
}
int main()
{
	//freopen("P2146.in","r",stdin);
	//freopen("Output.out","w",stdout);
	scanf("%d",&n);
	memset(son,-1,sizeof(son));
	for(int i=1;i<n;i++)
	{
		int u;
		scanf("%d",&u);
		E[u].push_back(i);
		E[i].push_back(u);
	}
	Dfs1(0,0);
	Dfs2(0,0);
	Build(1,1,n);
	scanf("%d",&T);
	while(T--)
	{
		string opt;
		int x;
		cin>>opt;
		scanf("%d",&x);
		if(opt=="install")
		{
			printf("%d\n",dep[x]-QueryI(0,x));
			UpdateI(0,x);
		}
		if(opt=="uninstall")
		{
			printf("%d\n",Query(1,id[x],id[x]+siz[x]-1));
			Update(1,id[x],id[x]+siz[x]-1,0);
		}
	}
	return 0;
}
2023/1/2 18:56
加载中...