rt,看到这个题先去把 P2709 的做法改了一下交,但是一直都 WA,然后就直接贺了 P1972 的树状数组写法,然后过了,有没有神仙看一下我 WA 的代码哪里错了
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,k;
const int N=200010;
int a[N];
long long ans[N],num;
int len;
struct query{
int l,r,id;
bool operator <(const query &a)const{
if((l-1)/len==(a.l-1)/len) return r<a.r;
return l/len<a.l/len;
}
}q[N];
int cnt[N];
void add(int x){++cnt[x]; if(cnt[x]==1) ++num;}
void del(int x){--cnt[x]; if(cnt[x]==0) --num;}
int main(){
cin>>n;
len=1;
while(len*len<n) ++len;
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
cin>>m;
for(int i=1;i<=m;++i){
scanf("%d%d",&q[i].l,&q[i].r); q[i].id=i;
}
sort(q+1,q+m+1);
int ll=1,rr=0;
for(int i=1;i<=m;++i){
int l=q[i].l,r=q[i].r;
while(l<ll) --ll,add(a[ll]);
while(r>rr) ++rr,add(a[rr]);
while(l>ll) del(a[ll]),++ll;
while(r<rr) del(a[rr]),--rr;
ans[q[i].id]=num;
}
for(int i=1;i<=m;++i) printf("%lld\n",ans[i]);
return 0;
}