莫队 WA on #8 求条
查看原帖
莫队 WA on #8 求条
936183
_zSqr_Mahiro_Oyama_楼主2024/10/10 14:06
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;

struct Q{
	int l,r,pos,x,id;
}q[N];

struct node{
	int to,next;
}e[N];

int h[N],cnt;
int n,m,f[N];
int lg[N],ff[N][25];
int dep[N],dfn[N],Max[N],tot;

int block; 
int l,r,sum[N],ans[N];

bool cmp(Q a,Q b){
	if(a.pos!=b.pos)
		return a.l<b.l;
	if(a.pos&1)return a.r<b.r;
	return a.r>b.r; 
}

void Link(int u,int v){
	e[++cnt].to=v;
	e[cnt].next=h[u];
	h[u]=cnt;
}
void dfs(int x,int fa){
	dep[x]=dep[fa]+1;
	dfn[x]=++tot;
	Max[x]=tot;
	
	ff[x][0]=fa;
	for(int i=1;i<=lg[dep[x]];i++)
		ff[x][i]=ff[ff[x][i-1]][i-1];
	
	for(int i=h[x];i;i=e[i].next){
		int y=e[i].to;
		dfs(y,x);
		Max[x]=max(Max[x],Max[y]); 
	}
}
int kth(int x,int k){
	if(dep[x]<=k)return 0;
	int res=x;
	while(k){
		res=ff[res][lg[k&-k]];
		k-=k&-k;
	}
	return res;
}

void add(int x){sum[dep[x]]++;}
void del(int x){sum[dep[x]]--;}

int main(){
	cin>>n;
	for(int i=2;i<=n;i++)
		lg[i]=lg[i-1]+((1<<lg[i-1]+1)==i);
	for(int i=1;i<=n;i++){
		cin>>f[i];
		if(f[i])Link(f[i],i);
	}
	for(int i=1;i<=n;i++)
		if(!f[i])dfs(i,0);
	
	cin>>m;
	block=sqrt(n);
	for(int i=1;i<=m;i++){
		int v,p;
		cin>>v>>p;
		int k=kth(v,p);
		q[i]=(Q){dfn[k],Max[k],(dfn[k]-1)/block+1,dep[v],i};
	}
	sort(q+1,q+1+m,cmp);
	l=1;r=0;
	for(int i=1;i<=m;i++){
		if(q[i].l==0)continue;
		while(l>q[i].l)add(--l);
		while(l<q[i].l)del(l++);
		while(r<q[i].r)add(++r);
		while(r>q[i].r)del(r--);
		ans[q[i].id]=sum[q[i].x];
	}
	for(int i=1;i<=m;i++)
		cout<<(ans[i]?ans[i]-1:0)<<' ';
	return 0;
}
2024/10/10 14:06
加载中...