真的求助帮帮我吧
查看原帖
真的求助帮帮我吧
220342
梦语小猪头楼主2020/12/3 21:59

8分代码不知道哪里错了

#include<cstdio>
#include<iostream>
#define M 10000017
#define N 1000017
using namespace std;

struct edge
{
	int v,next;
}e[N];

int dep[N],father[N][21],pow[21],rt[N],head[N],tot,cnt,n,m;
int lc[M],rc[M],sum[M];

void add(int u,int v)
{
	e[++tot].v = v;
	e[tot].next = head[u];
	head[u] = tot;
}

void change(int k,int l,int r,int pos)
{
	if(l == pos && pos == r)
	{
		sum[k] = 1;
		return;
	}
	int mid = (l + r) >> 1;
	if(pos <= mid)change(lc[k] = ++cnt,l,mid,pos);
	else change(rc[k] = ++cnt,mid + 1,r,pos);
}

bool sroot[N];

void merge(int k,int t,int l,int r)
{
	if(l == r){
		sum[k] += sum[t];
		return;
	}
	int mid = (l + r) >> 1;
	if(lc[t]){
		if(!lc[k])lc[k] = lc[t];
		else merge(lc[k],lc[t],l,mid);
	}
	if(rc[t]){
		if(!rc[k])rc[k] = rc[t];
		else merge(rc[k],rc[t],mid + 1,r);
	}
}

void dfs1(int u,int fa)
{
	dep[u] = dep[fa] + 1;
	change(rt[u] = ++cnt,1,n,dep[u]);
	father[u][0] = fa;
	for(int i = 1;i <= 20;i += 1)
		father[u][i] = father[father[u][i - 1]][i - 1];
	for(int i = head[u];i;i = e[i].next){
		int v = e[i].v;
		dfs1(v,u);
	}
}

void dfs2(int u,int fa)
{
	for(int i = head[u];i;i = e[i].next){
		int v = e[i].v;
		dfs2(v,u);
		merge(rt[u],rt[v],1,n);
	}
}

int getfa(int x,int y)
{
	int delta = y;
	for(int i = 20;i >= 0;i -= 1)
		if(pow[i] <= delta){
			delta -= pow[i];
			x = father[x][i];
		}
	return x;
}

int query(int k,int l,int r,int pos)
{
	if(l == pos && pos == r)return sum[k];
	int mid = (l + r) >> 1;
	if(pos <= mid){
		if(!lc[k])return 0;
		return query(lc[k],l,mid,pos);
	}
	else {
		if(!rc[k])return 0;
		return query(rc[k],mid + 1,r,pos);
	}
}

int main()
{
	pow[0] = 1;
	for(int i = 1;i <= 20;i += 1)
		pow[i] = pow[i - 1] * 2;
	scanf("%d",&n);
	for(int i = 1,fa;i <= n;i += 1)
	{
		scanf("%d",&fa);
		add(fa,i);
		if(fa == 0)sroot[i] = 1;
	}
	for(int i = 1;i <= n;i += 1)
		if(sroot[i])dfs1(i,0);
	for(int i = 1;i <= n;i += 1)
		if(sroot[i])dfs2(i,0);
	scanf("%d",&m);
	for(int q = 1,v,p;q <= m;q += 1)
	{
		scanf("%d%d",&v,&p);
		int to = getfa(v,p);	
		if(to == 0){
			printf("0 ");
			continue;
		}
		printf("%d ",query(rt[to],1,n,dep[v]) - 1);
	}
	return 0;
}
2020/12/3 21:59
加载中...