题目大意:静态统计序列区间中出现次数大于等于 2 的颜色数。
题解:类似于HH的项链,只需将 i 和 pre[i] 的关系对应到 pre[i] 和 pre[pre[i]] 的关系即可。
代码如下
#include <bits/stdc++.h>
using namespace std;
const int maxn=2e6+10;
inline int read(){
int x=0,f=1;char ch;
do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));
do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));
return f*x;
}
int n,m,lim,t[maxn],cor[maxn],pre[maxn],ans[maxn],h[maxn];
struct rec{int l,r,id;}q[maxn];
bool cmp(const rec &a,const rec &b){return a.r<b.r;}
inline int lowbit(int x){return x&-x;}
void modify(int pos,int val){
if(!pos)return;
for(int i=pos;i<=n;i+=lowbit(i))t[i]+=val;
}
int query(int pos){
int res=0;
for(int i=pos;i;i-=lowbit(i))res+=t[i];
return res;
}
void solve(){
n=read(),lim=read(),m=read();
for(int i=1;i<=n;i++)cor[i]=read();
for(int i=1;i<=m;i++)q[i].l=read(),q[i].r=read(),q[i].id=i;
sort(q+1,q+m+1,cmp);
for(int i=1;i<=n;i++)pre[i]=h[cor[i]],h[cor[i]]=i;
for(int i=1,j=1;i<=m;i++){
for(;j<=q[i].r;j++)modify(pre[pre[j]],-1),modify(pre[j],1);
ans[q[i].id]=query(q[i].r)-query(q[i].l-1);
}
for(int i=1;i<=m;i++)printf("%d
",ans[i]);
}
int main(){
solve();
return 0;
}