bzoj2743[HEOI2012]采花
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2743
和bzoj1878 HH的项链 一样的思路。一下想到只保留最靠右的两个值。所以把pre的pre删掉。
!仔细思考一下,发现每次加进去的是当前的pre。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=1e6+5; int n,m,c,pre[N],pos[N],f[N],a[N],ans[N]; struct Ques{ int l,r,id; }q[N]; int rdn() { int ret=0;char ch=getchar(); while(ch>'9'||ch<'0')ch=getchar(); while(ch<='9'&&ch>='0')(ret*=10)+=ch-'0',ch=getchar(); return ret; } bool cmp(Ques a,Ques b){return a.r<b.r;} void add(int x,int k) { for(;x<=n;x+=(x&-x))f[x]+=k; } int query(int x) { int ret=0; for(;x;x-=(x&-x))ret+=f[x]; return ret; } int main() { n=rdn();c=rdn();m=rdn(); for(int i=1;i<=n;i++)a[i]=rdn(); for(int i=1;i<=m;i++)q[i].l=rdn(),q[i].r=rdn(),q[i].id=i; sort(q+1,q+m+1,cmp);int dl=1; for(;!q[dl].r;dl++); for(int i=1;i<=n;i++) { pre[i]=pos[a[i]];pos[a[i]]=i; if(pre[pre[i]])add(pre[pre[i]],-1); if(pre[i])add(pre[i],1); while(q[dl].r==i)ans[q[dl].id]=query(i)-query(q[dl++].l-1); } for(int i=1;i<=m;i++)printf("%d\n",ans[i]); return 0; }