玄关 dus on tree TlE#9 求调
查看原帖
玄关 dus on tree TlE#9 求调
779970
lunjiahao楼主2024/2/23 21:39
#include<bits/stdc++.h>
#define PII pair<int,int>
using namespace std;
const int N=2e6+5;
int n,q,ans[N],top,val[N];
int tot,l[N],r[N],siz[N],hs[N],id[N],dep[N];
bool vis[N];
vector <int> g[N];
vector <PII> que[N];
unordered_map <string,int> mp;
set <int> cnt[N];
void dfs(int u,int fa)
{
	l[u]=++tot;
	dep[u]=dep[fa]+1;
	siz[u]=1;
	hs[u]=-1;
	id[tot]=u;
	for(auto v:g[u])
	{
		if(v==fa) continue;
		dfs(v,u);
		siz[u]+=siz[v];
		if(hs[u]==-1||siz[v]>siz[hs[u]]) hs[u]=v;
	}
	r[u]=tot;
}
void add(int x)
{
	cnt[dep[x]].insert(val[x]);
}
void del()
{
	for(int i=1;i<=tot;i++) cnt[i].clear();
}
void dfs(int u,int fa,bool ok)
{
	vis[u]=true;
	for(auto v:g[u])
	{
		if(v==fa||hs[u]==v) continue;
		dfs(v,u,false);
	}
	if(hs[u]!=-1)
		dfs(hs[u],u,true);
	for(auto v:g[u])
	{
		if(v==fa||hs[u]==v) continue;
		for(int w=l[v];w<=r[v];w++)
			add(id[w]);
	}
	add(u);
	for(auto [k,idx] :que[u])
		ans[idx]=cnt[k+dep[u]].size();
	if(!ok)
		del();
}
inline int read()
{
	int x=0;
	char ch=getchar();
	while(ch<'0'||ch>'9') ch=getchar();
	while(ch>='0'&&ch<='9')
	{
		x=(x<<1)+(x<<3)+ch-'0';
		ch=getchar();
	}
	return x;
}
signed main()
{
	ios::sync_with_stdio(0);
	cin>>n;
	for(int i=1,u;i<=n;i++)
	{
		string c;
		cin>>c>>u;
		if(!mp[c]) mp[c]=++top;
		val[i]=mp[c];
		if(!u) continue;
		g[i].push_back(u);
		g[u].push_back(i);
	}
	for(int i=1;i<=n;i++)
		if(!siz[i]) dfs(i,0);
	cin>>q;
	for(int i=1,u,d;i<=q;i++)
	{
		cin>>u>>d;
		que[u].emplace_back(d,i);
	}
	for(int i=1;i<=n;i++)
		if(!vis[i]) dfs(i,0,false);
	for(int i=1;i<=q;i++) cout<<ans[i]<<endl;
	return 0;
}
2024/2/23 21:39
加载中...