求助
查看原帖
求助
141599
sinsop90楼主2022/1/22 16:27
#include <bits/stdc++.h>
#define maxn 1000005
using namespace std;
int dep[maxn], fa[maxn], n, pq[maxn], k, cnt, tot, f[maxn][25], head[maxn], rt[maxn], m;
struct node {
	int v, pre;
}e[maxn << 1];
struct nod {
	int ls, rs, sum;
}tr[maxn << 2];
int Q[maxn], P[maxn], V[maxn];
void add(int u, int v) {
	e[++tot].v = v;
	e[tot].pre = head[u];
	head[u] = tot;
}
void dfs1(int now, int fat) {
	f[now][0] = fat;
	dep[now] = dep[fat] + 1;
	for(int i = 1;i <= 20;i++) f[now][i] = f[f[now][i - 1]][i - 1];
	for(int i = head[now];i;i = e[i].pre) {
		int v = e[i].v;
		if(v != fat) dfs1(v, now);     
	}
}
void pushup(int p) {
	tr[p].sum = tr[tr[p].ls].sum + tr[tr[p].rs].sum;
}
int update(int l, int r, int k, int p) {
	if(!p) p = ++cnt; 
	if(l == r) {
		tr[p].sum ++;
		return p;
	}
	int mid = (l + r) >>1;
	if(k <= mid) tr[p].ls = update(l, mid, k, tr[p].ls);
	if(k > mid) tr[p].rs = update(mid + 1, r, k, tr[p].rs);
	pushup(p);
	return p;
}
int merge(int l, int r, int x, int y) {
	if(!x || !y) return x + y;
	if(l == r) {
		tr[x].sum = tr[x].sum + tr[y].sum;
		return x;
	}
	int mid = (l + r) >> 1;
	tr[x].ls = merge(l, mid, tr[x].ls, tr[y].ls);
	tr[x].rs = merge(mid + 1, r, tr[x].rs, tr[y].rs);
	pushup(x);
	return x;
}
void dfs2(int now) {
	rt[now] = update(1, n, dep[now], rt[now]);
	for(int i = head[now];i;i = e[i].pre) {
		int v = e[i].v;
		if(v != f[now][0]) {
			dfs2(v);
			rt[now] = merge(1, n, rt[now], rt[v]);
		}
	}
}
int query(int l, int r, int k, int p) {
	if(!p) return 0;
	if(l == r) return tr[p].sum;
	int mid = (l + r) >> 1;
	if(k <= mid) return query(l, mid, k, tr[p].ls);
	else return query(mid + 1, r, k, tr[p].rs);
}
int main() {
	scanf("%d", &n);
	for(int i = 1;i <= n;i++) {
		int x;
		scanf("%d", &x);
		if(x) add(i, x), add(x, i);
		else pq[++k] = i;
	}
	scanf("%d", &m);
	for(int i = 1;i <= k;i++) dfs1(pq[i], 0);
	for(int i = 1;i <= m;i++) scanf("%d%d", &V[i], &P[i]);
	for(int i = 1;i <= m;i++) {
		int x = P[i], now = V[i], count = 0;
		while(x != 0) {
			if(x & 1) now = f[now][count];
			count ++;
			x >>= 1;
		}
		Q[i] = now;
	}
	for(int i = 1;i <= k;i++) dfs2(pq[i]);
	for(int i = 1;i <= m;i++) {
		int q = Q[i], p = P[i];
		int k = query(1, n, dep[q] + p, rt[q]);
		printf("%d ", k - (k != 0));
	}
}

第8个点WA

2022/1/22 16:27
加载中...