DSU on tree WA on #5求助
查看原帖
DSU on tree WA on #5求助
795344
lfxxx_楼主2024/10/14 09:58

rt

#include<bits/stdc++.h>	 
using namespace std;
const int N=1e5+5;
int n,m;
int cnt[N],ans[N];
map<string,int>mp[N];
struct query{int k,id;};
string na[N];
vector<int>root,edge[N];
vector<query>q[N];
int sz[N],son[N],dep[N];
int heavy;
void dfs1(int u,int fa)
{
	dep[u]=dep[fa]+1;
	sz[u]=1,son[u]=-1;
	for(auto &v:edge[u])
	{
		if(v==fa)
			continue;
		dfs1(v,u);
		sz[u]+=sz[v];
		if(son[u]==-1||sz[v]>sz[son[u]])
			son[u]=v;
	}
}
void update(int u,int fa,int val)
{
	if(val==1)
	{
		if(!mp[dep[u]][na[u]])
			++cnt[dep[u]];
		++mp[dep[u]][na[u]];
	}
	if(val==-1)
	{
		--mp[dep[u]][na[u]];
		if(!mp[dep[u]][na[u]])
			--cnt[dep[u]];
	}
	for(auto &v:edge[u])
	{
		if(v==fa||v==heavy)
			continue;
		update(v,u,val);
	}
}
void getans(int u)
{
	for(int i=0;i<(int)q[u].size();++i)
	{
		int k=q[u][i].k,id=q[u][i].id;
		if(dep[u]+k>n)
			ans[id]=0;
		else
			ans[id]=cnt[dep[u]+k];
	}
}
void dfs2(int u,int fa,int big)
{
	for(auto &v:edge[u])
		if(v!=fa&&v!=son[u])
			dfs2(v,u,0);
	if(~son[u])
		dfs2(son[u],u,1);
	heavy=son[u];
	update(u,fa,1);
	getans(u);
	heavy=0;
	if(!big)update(u,fa,-1);
	
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n;
	for(int i=1;i<=n;++i)
	{
		int f;
		cin>>na[i]>>f;
		if(f)edge[f].emplace_back(i);
		else root.emplace_back(i);
	}
	cin>>m;
	for(int i=1;i<=m;++i)
	{
		int u,k;
		cin>>u>>k;
		q[u].emplace_back((query){k,i});
	}
	for(auto &rt:root)
	{
		dfs1(rt,0);
		dfs2(rt,0,0);
	}
	for(int i=1;i<=m;++i)
		cout<<ans[i]<<'\n';
}
2024/10/14 09:58
加载中...