求助
查看原帖
求助
487320
mashiroyuki02楼主2021/10/8 09:24

// CREATED BY MASHIROYUKI

#include <bits/stdc++.h>
using namespace std;
#define IO ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#pragma GCC optimize("O3")
#define rep(i, x, n) for(int i = x; i <= n; i ++ )
#define downrep(i, x, n) for(int i = n; i >= x; i -- )

template<typename T> void debug(T x) {cout << "#debug: " << x << endl;}
template<typename T> void debug(T x, T y) {cout << "#debug: " << x << " " << y << endl;}
template<typename T>
void read(T &x){
    x = 0;
    char ch = getchar();
    while(!isdigit(ch)) ch = getchar();
    while(isdigit(ch)){
        x = (x << 1) + (x << 3) + (ch ^ 48);
        ch = getchar();
    }
}
typedef long long ll;
typedef double db;
const int mod = 1e9 + 7;
const int N=2e5+10;

struct Q{
	int k,id;
};
vector<Q>q[N];
vector<int>g[N];
vector<int> rt;
int rkn[N],hson[N],sz[N],L[N],R[N],dep[N],ord[N],ans[N];
int dfn,tot,n,m;
set<int> S[N];
map<string,int> mp;


void dfs0(int u,int d) {
	L[u]=++dfn;
	rkn[dfn]=u;
	dep[u]=d;
	sz[u]=1;
	for(auto v:g[u]) {
		dfs0(v,d+1);
		sz[u]+=sz[v];
		if(!hson[u]||sz[v]>sz[hson[u]]) hson[u]=v;
	}
	R[u]=dfn;
}

void add(int v) {
	int d=dep[v];
	S[d].insert(ord[v]);
}

void del(int v) {
	int d=dep[v];
	if(S[d].size()) S[d].clear();
}

void dfs1(int u,bool keep) {
	for(auto v:g[u]) if(v!=hson[u]) dfs1(v,0);
	if(hson[u])dfs1(hson[u],1);
	for(auto v:g[u]) if(v!=hson[u]) {
		rep(i,L[v],R[v]) add(rkn[i]);
	} 
	add(u);
	for(auto qr:q[u]) {
		ans[qr.id]=S[qr.k].size();
	}
	if(!keep) {
		rep(i,L[u],R[u]) del(rkn[i]);
	}
}

int get(string& x) {
	if(mp.find(x)==mp.end()) mp[x]=++tot;
	return mp[x];
}
void solve(){
	read(n);
	rep(i,1,n) {
		string s;cin>>s;
		int t;read(t);
		ord[i]=get(s);
		if(!t) rt.push_back(i);
		else g[t].push_back(i);
	}
	for(auto u:rt)dfs0(u,1);
	read(m);
	rep(i,1,m) {
		int u,d;
		read(u),read(d);
		q[u].push_back({d+dep[u],i}); //后面会继承重儿子的信息所以要转换成绝对关系
	}
	for(auto u:rt)dfs1(u,0);
	rep(i,1,m)
		printf("%d\n",ans[i]);
}

signed main()
{
	//IO
	solve();
	return 0;
}

这是蒟蒻的代码,一开始N开1e5+10out of bound了,但是开到2e5就过了,不是最大1e5吗?

2021/10/8 09:24
加载中...