首页 > 代码库 > 【不可能的任务13/200】bzoj2743离线+树状数组

【不可能的任务13/200】bzoj2743离线+树状数组

奇葩染色,对于每一个点关心的是前前个同颜色的位置,但是处理方法相同

离线比较神奇,按照右端点排序,然后每次用的是左端点,就不用建可持久化树状数组(什么鬼)了

区间修改+单点查询

果断差分以后用树状数组

 1 #include <cstdio> 2 #include <algorithm> 3 struct que 4 { 5     int l,r,id; 6 } q[1000001]; 7 bool operator<(que a,que b){return a.r<b.r;} 8 int n,l[1000001],an,c,m,o[1000001],pre[1000001],co[1000001],ans[1000001]; 9 void add(int a,int b)10 {11     while(a<=n)12         l[a]+=b,a+=a&-a;13 }14 int get(int a)15 {16     for(an=0;a;a-=a&-a)17         an+=l[a];18     return an;19 }20 int main()21 {22     scanf("%d%d%d",&n,&c,&m);23     for(int i=1;i<=n;i++)24         scanf("%d",&o[i]),pre[i]=co[o[i]],co[o[i]]=i;25     for(int i=1;i<=m;i++)26         scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i;27     std::sort(q+1,q+m+1);28     int rnow=0;29     for(int i=1;i<=m;i++)30     {31         while(rnow<q[i].r) 32             if(pre[++rnow]>0)33                 add(pre[pre[rnow]]+1,1),add(pre[rnow]+1,-1);34         ans[q[i].id]=get(q[i].l);35     }36     for(int i=1;i<=m;i++)37         printf("%d\n",ans[i]);38     return 0;39 } 

一A,开心

树状数组好久不写居然写对了

【不可能的任务13/200】bzoj2743离线+树状数组