求助巨佬,帮忙卡常
查看原帖
求助巨佬,帮忙卡常
757101
junee楼主2024/8/22 08:42
#include<iostream>
#include<iomanip>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<random>
#include<chrono>
#include<vector>
using namespace std;
mt19937_64 rnd(chrono::steady_clock::now().time_since_epoch().count());
typedef long long LL;
const int N=1e6+10;
int h[N],e[N*2],ne[N*2],idx;
int n,T,m;
int ans[N];
int dep[N],root[N];
int fa[N][16];
int stk[N],tt,cnt;
struct Query{
	int dep,id;
};
vector<Query>q[N];
void add(int a,int b){
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
struct node{
	int ls,rs,sum;
}tr[N*9];
int newnode(){
	if(tt)return stk[tt--];
	else return ++cnt;
}
void pushup(int u){
	tr[u].sum=tr[tr[u].ls].sum+tr[tr[u].rs].sum;
}
int insert(int u,int l,int r,int pos){
	if(!u)u=newnode();
	if(l==r){
		tr[u].sum+=1;
		return u;
	}
	int mid=(l+r)>>1;
	if(pos<=mid)tr[u].ls=insert(tr[u].ls,l,mid,pos);
	else tr[u].rs=insert(tr[u].rs,mid+1,r,pos);
	pushup(u);
	return u;
}
int merge(int x,int y,int l,int r){
	if(!x||!y)return x+y;
	if(l==r){
		tr[x].sum+=tr[y].sum;
		stk[++tt]=y;
		tr[y]={0,0,0};
		return x;
	}
	int mid=(l+r)>>1;
	tr[x].ls=merge(tr[x].ls,tr[y].ls,l,mid);
	tr[x].rs=merge(tr[x].rs,tr[y].rs,mid+1,r);
	pushup(x);
	stk[++tt]=y;
	tr[y]={0,0,0};
	return x;
}
int query(int u,int l,int r,int pos){
	if(l==r)return tr[u].sum;
	int mid=(l+r)>>1;
	if(pos<=mid)return query(tr[u].ls,l,mid,pos);
	else return query(tr[u].rs,mid+1,r,pos);
}
void init(){
	for(int i=1;i<=15;i++){
		for(int j=1;j<=n;j++){
			fa[j][i]=fa[fa[j][i-1]][i-1];
		}
	}
}
int find(int x,int k){
	if(dep[x]-k<1)return 0;
	int t=0;
	while(k){
		if(k&1)x=fa[x][t];
		k>>=1;
		t++;
	}
	return x;
}
void dfs_dep(int u,int f,int d){
	dep[u]=d;
	m=max(m,dep[u]);
	fa[u][0]=f;
	for(int i=h[u];~i;i=ne[i]){
		int j=e[i];
		if(j==f)continue;
		dfs_dep(j,u,d+1);
	}
}
void dfs(int u,int fa){
	for(int i=h[u];~i;i=ne[i]){
		int j=e[i];
		if(j==fa)continue;
		dfs(j,u);
		root[u]=merge(root[u],root[j],1,m);
	}
	root[u]=insert(root[u],1,m,dep[u]); 
	for(int i=0;i<q[u].size();i++){
		ans[q[u][i].id]=query(root[u],1,m,q[u][i].dep)-1;
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n>>T;
	for(int i=1;i<=n;i++)h[i]=-1;
	for(int i=2;i<=n;i++){
		int a;
		cin>>a;
		add(a,i),add(i,a);
	}
	dfs_dep(1,-1,1);
	init();
	for(int i=1;i<=T;i++){
		int u,k;
		cin>>u>>k;
		int x=find(u,k);
		if(!x)ans[i]=0;
		else q[x].push_back({dep[u],i});
	}
	dfs(1,-1);
	for(int i=1;i<=T;i++)cout<<ans[i]<<' ';
	return 0;
}
2024/8/22 08:42
加载中...