主席树为何全RE呢
查看原帖
主席树为何全RE呢
672776
XTianShuo楼主2022/11/2 21:50

跟题解中维护的都不一样 我维护的是 这个值出现的次数 在查询时查到叶子节点,做查分求解

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

const int N=1e6+10;

int n,cnt;
int a[N],tr[N];
struct T{
	int l,r;
	int sum;
}t[N*100];

int build(int l,int r)
{
	int p=++cnt;
	if(l==r)
		return p;
	int mid=l+r>>1;
	t[p].l=build(l,mid);
	t[p].r=build(mid+1,r);
}
int update(int p,int l,int r,int x)
{
	int u=++cnt;
	t[u].l=t[p].l,t[u].r=t[p].r;t[u].sum=t[p].sum;
	if(l==r)
	{
		t[u].sum++;
		return u;
	}
	int mid=l+r>>1;
	if(x<=mid)	t[u].l=update(t[p].l,l,mid,x);
	else t[u].r=update(t[p].r,mid+1,r,x);
	return u;
}
int query(int u1,int u2,int L,int R)
{
	if(L==R)
	{
	//	cout<<"   "<<L<<" "<<t[u1].sum<<" "<<t[u2].sum<<endl;
		if(t[u2].sum-t[u1].sum)
			return 1;
		else return 0;
	}
	int mid=L+R>>1,res=0;
	res+=query(t[u1].l,t[u2].l,L,mid);
	res+=query(t[u1].r,t[u2].r,mid+1,R);
	return res;
}

int main()
{
	scanf("%d",&n);
	int mx=0;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		mx=max(mx,a[i]);
	}
	tr[0]=build(1,mx);
	for(int i=1;i<=n;i++)
		tr[i]=update(tr[i-1],1,mx,a[i]);
	int m;
	scanf("%d",&m);
	for(int i=1;i<=m;i++)
	{
		int l,r;
		scanf("%d%d",&l,&r);
		printf("%d\n",query(tr[l-1],tr[r],1,mx));
	}
	return 0;
}
2022/11/2 21:50
加载中...