线段树做法WA on #9求调
查看原帖
线段树做法WA on #9求调
677440
ifffer_2137楼主2024/4/4 11:18

rt

//From: ifffer_2137
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define inf 0x7fffffff
#define DEBUG puts("DEBUG")
inline int read(){
    char ch=getchar();int x=0,w=1;
    while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+ch-48,ch=getchar();return w==1?x:-x;
}
const int maxn=1e5+5;
int n,m,mx;
int ans[maxn];
map<string,int> mp;
int c[maxn],tot;
int fa[maxn],dep[maxn],dfn[maxn],nfd[maxn],dfc;
int t[maxn],pre[maxn];
vector<int> tr[maxn],pt[maxn];
bool cmp1(int a,int b){
	return dfn[a]<dfn[b];
}
void dfs(int u){
	if(fa[u]!=-1){
		dep[u]=dep[fa[u]]+1;
		mx=max(mx,dep[u]);
	}
	dfn[u]=++dfc;
	pt[dep[u]].push_back(u);
	for(unsigned int i=0;i<tr[u].size();i++){
		int v=tr[u][i];
		if(v==fa[u]) continue;
		dfs(v);
	}
	nfd[u]=dfc;
}
struct ask{
	int id;
	int x,k;
};
vector<ask> q[maxn];
bool cmp2(ask a,ask b){
	return nfd[a.x]<nfd[b.x];
}
struct Segment_Tree{
	int sumv[maxn*4];
	void pushup(int o){
		sumv[o]=sumv[o*2]+sumv[o*2+1];
	}
	void update(int o,int l,int r,int x,int k){
		if(l==r){
			sumv[o]+=k;
			return;
		}
		int m=(l+r)/2;
		if(x<=m) update(o*2,l,m,x,k);
		else update(o*2+1,m+1,r,x,k);
		pushup(o);
	}
	int query(int o,int l,int r,int x,int y){
		if(x<=l&&r<=y){
			return sumv[o];
		}
		int m=(l+r)/2,res=0;
		if(x<=m) res+=query(o*2,l,m,x,y);
		if(y>m) res+=query(o*2+1,m+1,r,x,y);
		return res;
	}
}seg;
void solve(int d){
	if(q[d].empty()) return;
	sort(q[d].begin(),q[d].end(),cmp2);
	for(unsigned int i=0;i<pt[d].size();i++){
		int u=pt[d][i];
		pre[i]=t[c[u]]=-1;
	}
	for(unsigned int i=0;i<pt[d].size();i++){
		int u=pt[d][i];
		pre[i]=t[c[u]];
		t[c[u]]=i;
	}
	int ch=-1;
	for(unsigned int i=0;i<q[d].size();i++){
		while(ch==-1||(ch+1<(int)pt[d].size()&&dfn[pt[d][ch]]<nfd[q[d][i].x])){
			seg.update(1,1,dfc,dfn[pt[d][++ch]],1);
			if(pre[ch]!=-1){
				seg.update(1,1,dfc,dfn[pt[d][pre[ch]]],-1);
			}
		}
		ans[q[d][i].id]=seg.query(1,1,dfc,dfn[q[d][i].x],nfd[q[d][i].x]);
	}
	for(unsigned int i=0;i<pt[d].size();i++){
		if(seg.query(1,1,dfc,dfn[pt[d][i]],dfn[pt[d][i]])){
			seg.update(1,1,dfc,dfn[pt[d][i]],-1);
		}
	}
}
signed main(){
	cin.tie(0),cout.tie(0);
	n=read();
	for(int i=1;i<=n;i++){
		string id;
		cin>>id;
		if(!mp[id]) mp[id]=++tot;
		c[i]=mp[id];
		fa[i]=read();
		tr[fa[i]].push_back(i);
		tr[i].push_back(fa[i]);
	}
	fa[0]=-1;
	dfs(0);
	for(int i=1;i<=mx;i++){
		sort(pt[i].begin(),pt[i].end(),cmp1);
	}
	m=read();
	for(int i=1;i<=m;i++){
		ask a;
		a.id=i;
		a.x=read(),a.k=read();
		if(dep[a.x]+a.k<=mx) q[dep[a.x]+a.k].push_back(a);
	}
	for(int i=1;i<=mx;i++){
		solve(i);
	}
	for(int i=1;i<=m;i++){
		cout<<ans[i]<<endl;
	}
	return 0;
}
2024/4/4 11:18
加载中...