萌新求助树状数组
查看原帖
萌新求助树状数组
335366
0htoAi楼主2021/7/2 16:35

代码全RE,不知道哪里错了,数组开到 10710^7还是RE。

代码如下:

#include <bits/stdc++.h>

using namespace std;
const int MAXNUM=1e7+50;


struct Node
{
	int l,r,i;
}e[MAXNUM];
bool cmp(Node a,Node b)
{
	return a.r<b.r;
}

int lowbit(int x)
{
	return x&-x;
}
int add(int x,int c,int n,int tr[])
{
	for(int i=x;i<=n;i+=lowbit(i))
		tr[i]+=c;
}
int sum(int x,int tr[])
{
	int ans=0;
	for(int i=x;i;i-=lowbit(i))
		ans+=tr[i];
	return ans;
}

int N,M;
int a[MAXNUM],tr[MAXNUM];
int flag[MAXNUM];
int ans[MAXNUM];
int main()
{
	cin>>N;
	for(int i=1;i<=N;i++)
	{
		scanf("%d",&a[i]);

	}
	cin>>M;
	for(int i=1;i<=M;i++)
	{
		scanf("%d%d",&e[i].l,&e[i].r);
		e[i].i=i;
	}
	sort(e+1,e+M+1,cmp);
	int Nowi=0;
	for(int i=1;i<=M;i++)
	{
		while(Nowi<e[i].r)
		{
			Nowi++;
			if(flag[a[Nowi]]==0)
			{
				add(Nowi,1,N,tr);
				flag[a[Nowi]]=Nowi;
			}
			else
			{
				add(flag[a[Nowi]],-1,N,tr);
				add(Nowi,1,N,tr);
				flag[a[Nowi]]=Nowi;
			}
		}
		ans[e[i].i]=sum(e[i].r,tr)-sum(e[i].l-1,tr);
	}
	for(int i=1;i<=M;i++)
	{
		printf("%d\n",ans[i]);
	}
}
2021/7/2 16:35
加载中...