做题记录整理莫队2 P1972 [SDOI2009] HH的项链(2022/9/15)
一眼莫队题
虽然只有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;
}

浙公网安备 33010602011771号