首页 > 代码库 > 【不可能的任务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离线+树状数组
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。