主席树TLE求调
查看原帖
主席树TLE求调
280438
_Reven_楼主2022/9/22 16:43

rt,TLE #8 #9 #10

不知道是不是解法问题

#include<bits/stdc++.h>
using namespace std;
struct node
{
	int sum,ls,rs;
}tr[25*1000005];
int tot,n,m,rt[1000005];
struct bk
{
	int col,id,ne;
}a[1000005];
bool cmp1(bk a1,bk a2)
{
	if(a1.col==a2.col) return a1.id<a2.id;
	else return a1.col<a2.col;
}
bool cmp2(bk a1,bk a2)
{
	return a1.id<a2.id;
}
int build(int l,int r)
{
	int p=++tot;
	if(l==r) return p;
	int mid=(l+r)/2;
	tr[p].ls=build(l,mid);
	tr[p].rs=build(mid+1,r);
	return p;
}
int update(int k,int l,int r,int pos,int v)
{
	int p=++tot;
	tr[p]=tr[k];
	if(l==r)
	{
		tr[p].sum+=v;
		return p;
	}
	int mid=(l+r)/2;
	if(pos<=mid) tr[p].ls=update(tr[p].ls,l,mid,pos,v);
	else tr[p].rs=update(tr[p].rs,mid+1,r,pos,v);
	tr[p].sum=tr[tr[p].ls].sum+tr[tr[p].rs].sum;
	return p;
}
int query(int k,int l,int r,int L,int R)
{
	if(L<=l&&r<=R) return tr[k].sum;
	int mid=(l+r)/2,res=0;
	if(L<=mid) res+=query(tr[k].ls,l,mid,L,R);
	if(mid+1<=R) res+=query(tr[k].rs,mid+1,r,L,R);
	return res;
}
int main()
{
	scanf("%d",&n),rt[0]=build(1,1e6+1);
	for(int i=1;i<=n;i++) 
		scanf("%d",&a[i].col),a[i].id=i;
	sort(a+1,a+n+1,cmp1);
	for(int i=1;i<=n;i++)
	{
		if(a[i].col==a[i+1].col) a[i].ne=a[i+1].id;
		else a[i].ne=n+1;
	}
	sort(a+1,a+n+1,cmp2);
	for(int i=1;i<=n;i++) rt[i]=update(rt[i-1],1,1e6+1,a[i].ne,1);
	scanf("%d",&m);
	for(int i=1,l,r;i<=m;i++)
	{
		scanf("%d%d",&l,&r);
		printf("%d\n",query(rt[r],1,1e6+1,r+1,n+1)-query(rt[l-1],1,1e6+1,r+1,n+1));
	}
	return 0;
}
2022/9/22 16:43
加载中...