MnZn 求助,玄关,Dsu On Tree TLE on test 8
查看原帖
MnZn 求助,玄关,Dsu On Tree TLE on test 8
575363
revolutionary_oier楼主2024/11/18 15:01
#include<bits/stdc++.h> 
using namespace std;

const int maxn=1e5+10;
int n,m,ct;
int head[maxn],dep[maxn],siz[maxn],son[maxn],lg[maxn],cnt[maxn],ans[maxn];
int fa[maxn][20];
vector<pair<int,int> >q[maxn];
struct node{
	int v,nxt;
}e[maxn<<1];
inline void cal(){
	lg[1]=0;
	for(int i=2;i<=100000;i++)lg[i]=lg[i/2]+1;
}
inline void add(int u,int v){
	e[++ct].v=v;
	e[ct].nxt=head[u];
	head[u]=ct;
}
inline void ipt(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		int u;
		scanf("%d",&u);
		add(u,i);
	}
}
inline void dfs1(int u,int f){
	siz[u]=1;
	son[u]=0;
	fa[u][0]=f;
	for(int i=1;i<=lg[dep[u]];i++)fa[u][i]=fa[fa[u][i-1]][i-1];
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].v;
		dep[v]=dep[u]+1;
		dfs1(v,u);
		siz[v]+=siz[u];
		if(siz[v]>siz[son[u]])son[u]=v;
	}
}
inline int find(int u,int k){
	if(k>dep[u])return 0;
	for(int i=0;i<=20;i++){
		if(k&(1<<i))u=fa[u][i];
	}	
	return u;
}
inline void init(){
	scanf("%d",&m);
	for(int i=1;i<=m;i++){
		int v,p;
		scanf("%d%d",&v,&p);
		v=find(v,p);
		q[v].push_back(make_pair(i,p));
	}
} 
inline void modify(int u,int flag){
	cnt[dep[u]]+=flag;
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].v;
		modify(v,flag);
	}
}
inline void dfs2(int u){
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].v;
		if(v==son[u])continue;
		dfs2(v);
		modify(v,-1);
	}
	if(son[u])dfs2(son[u]);
	cnt[dep[u]]++;
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].v;
		if(v==son[u])continue;
		modify(v,1);
	}
	for(int i=0;i<q[u].size();i++){
		int k=q[u][i].second;
		int op=q[u][i].first;
		if(u!=0)ans[op]=cnt[dep[u]+k]-1;
		else ans[op]=0;
	}
}
inline void output(){
	for(int i=1;i<=m;i++)printf("%d ",ans[i]);
	printf("\n");
}
signed main(){
	cal();
	ipt();
	dfs1(0,0);
	init();
	dfs2(0);
	output();
	return 0;
} 
2024/11/18 15:01
加载中...