P3459 悬赏一关求hack
  • 板块学术版
  • 楼主zn_qq_he
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/7/16 14:44
  • 上次更新2023/11/3 09:32:26
查看原帖
P3459 悬赏一关求hack
705385
zn_qq_he楼主2023/7/16 14:44
#include<bits/stdc++.h>
using namespace std;
vector<int> g[250100];
int df[250100],ys[250100],l[250100],r[250100],t[250100],n,a,b,m;
char s[2];
inline int read(){
    int a=0;char x=getchar();
    while(x<'0'||x>'9')x=getchar();
    while(x>='0'&&x<='9')a=(a<<3)+(a<<1)+x-48,x=getchar();
    return a;
}
int dfs(int id,int dep)
{
	df[++df[0]]=id;
	t[df[0]]=dep;
	ys[id]=df[0];
	if(g[id].size()==0)
	{
		l[id]=r[id]=df[0];
		return 1;
	}
	l[id]=df[0];
	int len=0;
	for(int i=0;i<g[id].size();i++)
		len+=dfs(g[id][i],dep+1);
	r[id]=l[id]+len;
	return len;
}
int lowbit(int x)
{
	return x&(x^(x-1));
}
void chg(int x,int num)
{
	while(x<=n)
	{
		t[x]+=num;
		x+=lowbit(x);
	}
	return;
}
int sc(int x)
{
	int num=0;
	while(x>0)
	{
		num+=t[x];
		x-=lowbit(x);
	}
	return num;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n-1;i++)
	{
		scanf("%d%d",&a,&b);
		g[a].push_back(b);
	}
	a=dfs(1,0);
	for(int i=n;i>=1;i--)
		t[i]=t[i]-t[i-1];
	for(int i=1;i<=n;i++)
	{
		a=i;
		b=1;
		while(a%2==0)
		{
			a/=2;
			t[i]+=t[i-b];
			b*=2;
		}
	}
	char op;
	scanf("%d",&m);
	int k=m+n-1;
	while(k--)
	{
		scanf("%s",s);
		if(s[0]=='A')
		{
			a=read();
			b=read();
			chg(l[b],-1);
			chg(r[b]+1,1);
		}
		else if(s[0]=='W')
		{
			a=read();
			printf("%d\n",sc(ys[a]));
		}
	}
	return 0;
}
2023/7/16 14:44
加载中...