萌新求救
查看原帖
萌新求救
363166
Madsome楼主2022/7/20 08:49
#include<bits/stdc++.h>
using namespace std;
int n,m,st;
int fa[500001],x[100001];
int col[500009],ans[500009];
int bj[500009],cnt[500009];
int wson[500009],siz[500009],dep[500009];
string s[100001];
vector<int> e[500009];
vector< pair <int,int> > g[500009];
map<string,int> fl[100001];
void dfs(int u,int f){
	siz[u]=1;
	dep[u]=dep[f]+1;
	for(int i=0;i<e[u].size();++i){
		int v=e[u][i];
		if(v==f) continue;
		dfs(v,u);
		siz[u]+=siz[v];
		if(siz[wson[u]]<siz[v]) wson[u]=v;
	}
}
void solve(int u,int f,int k){
	fl[dep[u]][s[u]]+=k;
	if(fl[dep[u]][s[u]]==1 && k==1) cnt[dep[u]]++;
	if(fl[dep[u]][s[u]]==0 && k==-1) cnt[dep[u]]--;
	for(int i=0;i<e[u].size();++i){
		int v=e[u][i];
		if(v!=f && !bj[v])
		  solve(v,u,k);
	}
}
void dsu(int u,int f,int k){
	for(int i=0;i<e[u].size();++i){
		int v=e[u][i];
		if(v!=f && v!=wson[u]){
			dsu(v,u,0);
		}
	}
	if(wson[u]) dsu(wson[u],u,1),bj[wson[u]]=1;
	solve(u,f,1);
	for(int i=0;i<g[u].size();++i){
		int id=g[u][i].first;
		int d=g[u][i].second;
		ans[id]=cnt[d+dep[u]];
	}
	if(wson[u]) bj[wson[u]]=0;
	if(k==0) solve(u,f,-1);
}
int main(){
    ios ::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;++i){
		cin>>s[i];
		cin>>x[i];
		e[x[i]].push_back(i);
	}
	cin>>m;
	for(int i=1;i<=m;++i){
		int v,p;
		cin>>v>>p;
		g[v].push_back({i,p});
	}
	dfs(0,0);
	dsu(0,0,1);
	for(int i=1;i<=m;++i){
		cout<<ans[i]<<'\n';
	}
  return 0;
}

TLE #62

2022/7/20 08:49
加载中...