RE 40pts 求调
查看原帖
RE 40pts 求调
754310
Pepsee楼主2023/11/23 16:55

调了很久,觉得没有什么问题了,但是一直 RE

#include <bits/stdc++.h>
#define maxn 2000001
#define int long long
using namespace std;
inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return x*f;
}
int n,m,cod = 0;
int head[maxn],tot;
int root[maxn],cnt;
int f[maxn],dep[maxn];
int ans[maxn],id[maxn],top[maxn];
int siz[maxn],son[maxn],rk[maxn];
vector<int> ver[maxn];
struct nd{
	int nex,to;
}edge[maxn<<1];
struct nn{
	int ls,rs,val;
}tr[10000001];
struct nnnd{
	int id,v,k;
}q[maxn];
void add(int x,int y)
{
	edge[++tot].nex = head[x];
	edge[tot].to = y;
	head[x] = tot;
}
void pushup(int rt){
	tr[rt].val = tr[tr[rt].ls].val+tr[tr[rt].rs].val;
}
int merge(int x,int y,int l,int r)
{
	if (!x) return y;
	if (!y) return x;
	if (l == r){
		tr[x].val += tr[y].val;
		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);
	return x;
}
int add(int rt,int l,int r,int x,int a)
{
	if (!rt) rt = ++cnt;
	if (l == r){
		tr[rt].val += a;
		return rt;
	}
	int mid = (l+r) >> 1;
	if (x <= mid) tr[rt].ls = add(tr[rt].ls,l,mid,x,a);
	else tr[rt].rs = add(tr[rt].rs,mid+1,r,x,a);
	pushup(rt);
	return rt;
}
int query(int rt,int l,int r,int x)
{
	int res = 0;
	if (l == r) return tr[rt].val;
	int mid = (l+r) >> 1;
	if (x <= mid) res += query(tr[rt].ls,l,mid,x);
	else res += query(tr[rt].rs,mid+1,r,x);
	return res;
}
void dfs(int x)
{
	for (int i = head[x]; i; i = edge[i].nex)
	{
		int v = edge[i].to;
		if (v == f[x]) continue;
		dfs(v);
		root[x] = merge(root[x],root[v],1,6e5);
	}
	for (int i = 0; i < (int)ver[x].size(); i++)
		ans[ver[x][i]] = query(root[x],1,6e5,dep[q[ver[x][i]].v]+q[ver[x][i]].k)-1;
}
void df(int x,int fa)
{
	dep[x] = dep[fa]+1; siz[x] = 1;
	root[x] = add(root[x],1,6e5,dep[x],1);
	for (int i = head[x]; i; i = edge[i].nex)
	{
		int v = edge[i].to;
		if (v == fa) continue;
		df(v,x);
		siz[x] += siz[v];
		if (siz[v] > siz[son[x]])
			son[x] = v;
	}
}
void dfs2(int x,int tp)
{
	top[x] = tp;
	id[x] = ++cod; rk[cod] = x;
	if (son[x]) dfs2(son[x],tp);
	for (int i = head[x]; i; i = edge[i].nex)
	{
		int v = edge[i].to;
		if (v == f[x] || v == son[x])
			continue;
		dfs2(v,v);
	}
}
int find(int x,int k)
{
	while (k >= (id[x]-id[top[x]]+1) && x!=0)
	{
		k = k-(id[x]-id[top[x]]+1);
		x = f[top[x]];
	}
	if (id[x]-k <= 0) return 0;
	return rk[id[x]-k];
}
signed main()
{
	n = read(); m = read();
	for (int i = 2,x; i <= n; i++){
		x = read();
		add(i,x),add(x,i);
		f[i] = x;
	}
	df(1,0); dfs2(1,1);
	for (int i = 1; i <= m; i++)
	{
		q[i].id = i;
		q[i].v = read(); q[i].k = read();
		q[i].v = find(q[i].v,q[i].k);
		ver[q[i].v].push_back(i);
	}
	dfs(1);
	for (int i = 1; i <= m; i++)
		printf("%lld ",ans[i]);
	return 0;
}
2023/11/23 16:55
加载中...