做题记录整理莫队2 P1972 [SDOI2009] HH的项链(2022/9/15)

P1972 [SDOI2009] HH的项链

一眼莫队题
虽然只有32分
和模板的区别只有jia()函数

#include<bits/stdc++.h>
#define for1(i,a,b) for(int i = a;i<=b;i++)
#define ll long long
using namespace std;
int z[5000005],s[5000005];
int nex[5000005];
int cnt;
int n,m;
struct node{
	int l;
	int r;
	int ans;
	int id;
}a[5000005];

bool cmp(node x,node y)
{
	return x.r<y.r;
}
bool cmp2(node x,node y)
{
	return x.id<y.id;
}
int lb(int x)
{
	return x&-x;
}

void xg(int x,int k)
{
	while(x<=n)
	{
		s[x]+=k;
		x+=lb(x);
	}
}

int qh(int y)
{
	int ans=0;
	while(y)
	{
		ans+=s[y];
		y-=lb(y);
	}
	return ans;
}
int main()
{
	scanf("%d",&n);
	for1(i,1,n) scanf("%d",&z[i]);
	cin>>m;
	for1(i,1,m)
	scanf("%d%d",&a[i].l,&a[i].r),a[i].id=i;
	sort(a+1,a+m+1,cmp);
	cnt=1;
	for1(i,1,m)
	{
		int qr=a[i].r;
		for1(j,cnt,qr)
		{
			if(nex[z[j]])
				xg(nex[z[j]],-1);
			xg(j,1);
			nex[z[j]]=j;
		}
		cnt=qr+1;
		a[i].ans=qh(a[i].r)-qh(a[i].l-1);
	}
	sort(a+1,a+m+1,cmp2);
	for1(i,1,m)
	{
		printf("%d\n",a[i].ans);
	}
	return 0;
}
posted @ 2022-09-15 20:13  yyx525jia  阅读(18)  评论(0)    收藏  举报