题意有误
查看原帖
题意有误
128591
Refined_heart楼主2021/7/1 14:17

据定义

节点 u 的 1-father 为 路径 (1, u) 上距 u 最近的节点

所以节点 1 的 节点 1 的 1-father 为 路径 (1, 1) 上距 1 最近的节点,那么就是 1。

如果按照 "节点 1 的 1-father 仍为 1" 也能做,但数据并不是这样子的?

对于这组数据输出应该为 1

4 1
1 1 3
2 2

也就是遇到查询 depu<kdep_u<k 的查询直接答案算为 0 了,是题意有误还是大家都写错了。

还有能不能帮我调下代码啊qwq,最后一个点WA了。

#include<bits/stdc++.h>
using namespace std;
const int MAXN=2.3e6+10;
const int N=1000010;
int n,m;
int head[N],st[N],dep[N];
int tot,sum[MAXN],rt[N];
int node,rub[MAXN],ttop;
int ls[MAXN],rs[MAXN];
int ans[N],Maxdep,tops;
struct E {
	int nxt,to;
} e[N];
inline void add(int x,int y) {
	e[++tot]=(E) {head[x],y};
	head[x]=tot;
}
struct List{
	int nxt;
	pair<int,int>v;
}vt[N<<1];
int Head[N<<1],cnt;
void add_query(int pos,pair<int,int> v){
	vt[++cnt]=(List){Head[pos],v};
	Head[pos]=cnt;
}
inline int Max(int x,int y){return x>y?x:y;}
struct Q {
	int v,p;
} q[N];
inline int bd() {
	if(ttop)return rub[ttop--];
	return ++node;
}
inline void del(int x) {
	rub[++ttop]=x;
	sum[x]=0;ls[x]=rs[x]=0;
}
inline void pushup(int x) {sum[x]=sum[ls[x]]+sum[rs[x]];}
void change(int &x,int L,int R,int pos,int v) {
	if(!x)x=bd();
	if(L==R) {
		sum[x]+=v;
		return;
	}
	int mid=(L+R)>>1;
	if(pos<=mid)change(ls[x],L,mid,pos,v);
	else change(rs[x],mid+1,R,pos,v);
	pushup(x);
}
int query(int x,int L,int R,int pos) {
	if(L==R)return sum[x];
	int mid=(L+R)>>1;
	if(pos<=mid)return query(ls[x],L,mid,pos);
	return query(rs[x],mid+1,R,pos);
}
int merge(int x,int y,int l,int r) {
	if(!x||!y)return x+y;
	if(l==r) {
		sum[x]+=sum[y];
		del(y);
		return x;
	}
	int mid=(l+r)>>1;
	ls[x]=merge(ls[x],ls[y],l,mid);
	rs[x]=merge(rs[x],rs[y],mid+1,r);
	del(y);
	pushup(x);
	return x;
}
void dfs_merge(int x) {
	st[++tops]=x;
	change(rt[x],1,Maxdep,dep[x],1);
	for(int i=Head[x];i;i=vt[i].nxt){
		pair<int,int>j=vt[i].v;
		add_query(st[tops-j.first]+n,j);
	}
	for(int i=head[x]; i; i=e[i].nxt) {
		int j=e[i].to;
		dfs_merge(j);
		rt[x]=merge(rt[x],rt[j],1,Maxdep);
	}
	for(int i=Head[x+n];i;i=vt[i].nxt){
		pair<int,int>j=vt[i].v;
		ans[j.second]=query(rt[x],1,Maxdep,dep[x]+j.first);
	}
	tops--;
}
void dfs(int x){
	for(int i=head[x];i;i=e[i].nxt){
		int j=e[i].to;
		dep[j]=dep[x]+1;
		Maxdep=Max(Maxdep,dep[j]);
		dfs(j);
	}
}
int main() {
//    freopen("in.txt","r",stdin);
	scanf("%d%d",&n,&m);dep[1]=1;
	for(int i=1,x; i<n; ++i) {
		scanf("%d",&x);
		add(x,i+1);
	}
	dfs(1);
	for(int i=1; i<=m; ++i) {
		scanf("%d%d",&q[i].v,&q[i].p);
		if(dep[q[i].v]>q[i].p)
			add_query(q[i].v,make_pair(q[i].p,i));
	}
	dfs_merge(1);
	for(int i=1; i<=m; ++i){
		int A=Max(ans[i]-1,0);
		printf("%d ", A);	
	}
	return 0;
}
2021/7/1 14:17
加载中...