请求问题!!!!
查看原帖
请求问题!!!!
558234
swa_0808楼主2024/1/2 11:36

为什么query函数中加上Pushup会得到错误答案

#include <bits/stdc++.h>
using namespace std;

const int maxn=1e5+5;

int n,p[maxn],ans[maxn],lc[maxn*18],rc[maxn*18],d[maxn*18],b[maxn],rt[maxn],num;

struct node{
	int next,to;
}edge[maxn<<1];

int head[maxn<<1],len;

void Insert(int from,int to){
	edge[++len].next=head[from];
	edge[len].to=to;
	head[from]=len;
}

void Pushup(int p){
	d[p]=d[lc[p]]+d[rc[p]];
}

void Modify(int s,int t,int &p,int pos){
	if(!p)	p=++num;
	if(s==t){
		d[p]++;
		return;
	}	
	int mid=s+t>>1;
	if(pos<=mid)	Modify(s,mid,lc[p],pos);
	else			Modify(mid+1,t,rc[p],pos);
	Pushup(p);
}

int query(int s,int t,int p,int l,int r){
	if(!p)	return 0;
	if(l<=s && r>=t)	return d[p];
	int mid=s+t>>1,tot=0;
	Pushup(p);
	if(l<=mid)		tot+=query(s,mid,lc[p],l,r);
	if(r>mid)		tot+=query(mid+1,t,rc[p],l,r);
	return tot;
}

int Merge(int s,int t,int l,int r){
	if(!l || !r)	return l+r;
	if(s==t){
		d[l]+=d[r];
		return l;
	}
	int mid=s+t>>1;
	lc[l]=Merge(s,mid,lc[l],lc[r]);
	rc[l]=Merge(mid+1,t,rc[l],rc[r]);
	Pushup(l);
	return l;
}

void dfs(int u,int fa){
	for(int i=head[u];i;i=edge[i].next){
		int v=edge[i].to;
		if(v==fa)	continue;
		dfs(v,u);
		rt[u]=Merge(1,n,rt[u],rt[v]);
	}
	ans[u]+=query(1,n,rt[u],p[u]+1,n);
}

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)	scanf("%d",&p[i]),b[i]=p[i];
	sort(b+1,b+1+n);
	for(int i=1;i<=n;i++)	p[i]=lower_bound(b+1,b+1+n,p[i])-b;
	for(int i=2;i<=n;i++){
		int v;
		scanf("%d",&v);
		Insert(v,i),Insert(i,v);
	}
	for(int i=1;i<=n;i++){
		rt[i]=++num;
		Modify(1,n,rt[i],p[i]);
	}
	dfs(1,0);
	//for(int i=1;i<=num;i++)		cout <<d[i]<<' ';
	//cout <<endl;
	for(int i=1;i<=n;i++)	printf("%d\n",ans[i]);
	return 0;
}
2024/1/2 11:36
加载中...