求调 #9TLE
查看原帖
求调 #9TLE
91433
czy0407楼主2024/2/23 20:02
#include<bits/stdc++.h>
#define ll long long
using namespace std;
long long n,m,hs[100010],sz[100010],l[100010],d[100010],dep[100010],r[100010],dfn[100010],id[100010],ans[100010],num,mx,u,v;
vector<int> e[100010],as[100010],nu[100010],sta;
map<string,int> s;
string c[100010],st;
void dfs1(ll u,ll fa)
{
	dep[u]=dep[fa]+1;
	sz[u]=1;
	hs[u]=-1;
	dfn[++num]=u;
	l[u]=num;
	for(int v:e[u])
	{
		if(v==fa)continue;
		dfs1(v,u);
		sz[u]+=sz[v];
		if(hs[u]==-1||sz[hs[u]]<sz[v])hs[u]=v;
	}
	r[u]=num;
}
void add(ll x)
{
	if(s[c[x]]==0)d[dep[x]]++;
	s[c[x]]++;
}
void del(ll x)
{
	s[c[x]]--;
	if(s[c[x]]==0)d[dep[x]]--;
}
void dfs2(ll u,ll fa,bool ok)
{
	for(int v:e[u])
	{
		if(v==fa||v==hs[u])continue;
		dfs2(v,u,0);
	}
	if(hs[u]!=-1)dfs2(hs[u],u,1);
	for(int v:e[u])
	{
		if(v==fa||v==hs[u])continue;
		for(int i=l[v];i<=r[v];i++)add(dfn[i]);
	}
	add(u);
	for(int i=0;i<as[u].size();i++)ans[nu[u][i]]+=d[as[u][i]+dep[u]];
	if(ok==0)
	{
		for(int i=l[u];i<=r[u];i++)del(dfn[i]);
		for(int i=1;i<=100000;i++)d[i]=0;
	}
}
int main()
{
	ios::sync_with_stdio(0);
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>c[i]>>u;
		e[u].push_back(i);
		e[i].push_back(u);
		if(u==0)sta.push_back(i);
	}
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>u>>v;
		as[u].push_back(v);
		nu[u].push_back(i); 
	}
	
	for(int i:sta)dfs1(i,0);
	for(int i:sta)dfs2(i,0,0);
	for(int i=1;i<=m;i++)cout<<ans[i]<<' ';
	return 0;
}
2024/2/23 20:02
加载中...