传送门

直接把修改的数拆成logloglog个二进制位一个一个修改是会TLETLETLE的。

因此我们把303030个二进制位压成一位储存在线段树里面。

然后维护区间中最靠左二进制位不为0/1的下标。

手动模拟一波进/退位就行了。

代码:

  1. #include<bits/stdc++.h>
  2. #define lc (p<<1)
  3. #define rc (p<<1|1)
  4. #define mid (T[p].l+T[p].r>>1)
  5. using namespace std;
  6. inline int read(){
  7. int ans=0,w=1;
  8. char ch=getchar();
  9. while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
  10. while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
  11. return ans*w;
  12. }
  13. const int N=2e6+5,up=(1<<30)-1,n=1e6;
  14. struct Node{int l,r,val,cov,pos[2];}T[N<<2];
  15. int q,bit[31];
  16. inline void pushup(int p){T[p].pos[0]=min(T[lc].pos[0],T[rc].pos[0]),T[p].pos[1]=min(T[lc].pos[1],T[rc].pos[1]);}
  17. inline void pushnow(int p,int typ){T[p].cov=typ,T[p].val=typ*up,T[p].pos[typ]=n+1,T[p].pos[typ^1]=T[p].l;}
  18. inline void pushdown(int p){if(~T[p].cov)pushnow(lc,T[p].cov),pushnow(rc,T[p].cov),T[p].cov=-1;}
  19. inline void build(int p,int l,int r){
  20. T[p].l=l,T[p].r=r,T[p].cov=-1;
  21. if(T[p].l==T[p].r){T[p].pos[0]=n+1,T[p].pos[1]=l,T[p].val=0;return;}
  22. build(lc,l,mid),build(rc,mid+1,r),pushup(p);
  23. }
  24. inline void update(int p,int ql,int qr,int v){
  25. if(ql>T[p].r||qr<T[p].l)return;
  26. if(ql<=T[p].l&&T[p].r<=qr)return pushnow(p,v);
  27. pushdown(p);
  28. if(qr<=mid)update(lc,ql,qr,v);
  29. else if(ql>mid)update(rc,ql,qr,v);
  30. else update(lc,ql,mid,v),update(rc,mid+1,qr,v);
  31. pushup(p);
  32. }
  33. inline void modify(int p,int k,int v){
  34. if(T[p].l==T[p].r){T[p].val=v,T[p].pos[0]=T[p].val==0?n+1:T[p].l,T[p].pos[1]=T[p].val==up?n+1:T[p].l;return;}
  35. pushdown(p);
  36. if(k<=mid)modify(lc,k,v);
  37. else modify(rc,k,v);
  38. pushup(p);
  39. }
  40. inline void change(int p,int k,int v){
  41. if(T[p].l==T[p].r){T[p].val+=v,T[p].pos[0]=T[p].val==0?n+1:T[p].l,T[p].pos[1]=T[p].val==up?n+1:T[p].l;return;}
  42. pushdown(p);
  43. if(k<=mid)change(lc,k,v);
  44. else change(rc,k,v);
  45. pushup(p);
  46. }
  47. inline int query(int p,int k){
  48. if(T[p].l==T[p].r)return T[p].val;
  49. pushdown(p);
  50. if(k<=mid)return query(lc,k);
  51. return query(rc,k);
  52. }
  53. inline int ask(int p,int ql,int qr,int typ){
  54. if(ql>T[p].r||qr<T[p].l)return n+1;
  55. if(ql<=T[p].l&&T[p].r<=qr)return T[p].pos[typ];
  56. pushdown(p);
  57. if(qr<=mid)return ask(lc,ql,qr,typ);
  58. if(ql>mid)return ask(rc,ql,qr,typ);
  59. return min(ask(lc,ql,mid,typ),ask(rc,mid+1,qr,typ));
  60. }
  61. int main(){
  62. bit[0]=1;
  63. for(int i=1;i<=30;++i)bit[i]=bit[i-1]<<1;
  64. build(1,1,n);
  65. q=read();
  66. int t=read();
  67. t=read(),t=read();
  68. while(q--){
  69. int op=read();
  70. if(op==1){
  71. long long a=read();
  72. int b=read(),x=b/30+1,y=b%30;
  73. a=a*bit[y];
  74. long long upd=1ll*query(1,x+1)*bit[30]+1ll*query(1,x);
  75. if(a>=0){
  76. upd+=a;
  77. modify(1,x,upd%bit[30]),upd/=bit[30];
  78. modify(1,x+1,upd%bit[30]),upd/=bit[30];
  79. if(!upd)continue;
  80. int id=ask(1,x+2,n,1);
  81. change(1,id,1),update(1,x+2,id-1,0);
  82. }
  83. else{
  84. bool fu=0;
  85. upd+=a;
  86. if(upd<0)upd+=1ll*bit[30]*bit[30],fu=1;
  87. modify(1,x,upd%bit[30]),upd/=bit[30];
  88. modify(1,x+1,upd%bit[30]),upd/=bit[30];
  89. if(!fu)continue;
  90. int id=ask(1,x+2,n,0);
  91. change(1,id,-1),update(1,x+2,id-1,1);
  92. }
  93. }
  94. else{
  95. int a=read(),x=a/30+1,y=a%30;
  96. printf("%d\n",(query(1,x)&bit[y])?1:0);
  97. }
  98. }
  99. return 0;
  100. }

2018.10.30 bzoj4942: [Noi2017]整数(线段树压位)的更多相关文章

  1. [BZOJ4942][Noi2017]整数 线段树+压位

    用线段树来模拟加减法过程,维护连续一段中是否全为0/1. 因为数字很大,我们60位压一位来处理. #include<iostream> #include<cstring> #i ...

  2. UOJ #314. 【NOI2017】整数 | 线段树 压位

    题目链接 UOJ 134 题解 可爱的电音之王松松松出的题--好妙啊. 首先想一个朴素的做法! 把当前的整数的二进制当作01序列用线段树维护一下(序列的第i位就是整数中位权为\(2^k\)的那一位). ...

  3. 【BZOJ4942】[Noi2017]整数 线段树+DFS(卡过)

    [BZOJ4942][Noi2017]整数 题目描述去uoj 题解:如果只有加法,那么直接暴力即可...(因为1的数量最多nlogn个) 先考虑加法,比较显然的做法就是将A二进制分解成log位,然后依 ...

  4. 【洛谷3822】[NOI2017] 整数(线段树压位)

    题目: 洛谷 3822 分析: 直接按题意模拟,完了. 将每次加 / 减拆成不超过 \(32\) 个对单独一位的加 / 减. 考虑给一个二进制位(下称「当前位」)加 \(1\) 时,如果这一位本来就是 ...

  5. 2018.09.30 bzoj4025: 二分图(线段树分治+并查集)

    传送门 线段树分治好题. 这道题实际上有很多不同的做法: cdq分治. lct. - 而我学习了dzyo的线段树分治+并查集写法. 所谓线段树分治就是先把操作分成lognlognlogn个连续不相交的 ...

  6. [Bzoj4942][Noi2017]整数(线段树)

    4942: [Noi2017]整数 Time Limit: 50 Sec  Memory Limit: 512 MBSubmit: 363  Solved: 237[Submit][Status][D ...

  7. BZOJ4942 NOI2017整数(线段树)

    首先把每32位压成一个unsigned int(当然只要压起来能过就行).如果不考虑进/退位的话,每次只要将加/减上去的数拆成两部分直接单点修改就好了.那么考虑如何维护进/退位.可以发现进位的过程其实 ...

  8. noi2017 T1 整数 ——线段树

    loj.ac上有  题目传送门 不过我还是把题目搬过来吧 整数(integer)[题目背景]在人类智慧的山巅,有着一台字长为 1048576 位的超级计算机,著名理论计算机科 学家 P 博士正用它进行 ...

  9. 【noi2017】 整数 线段树or模拟

    ORZYYB 题目大意:你需要维护一个有$3\times 10^7$个二进制位的数,有一种修改方式和一种询问方式 对这个数加上$a\times2^b$,其中$|a|≤10^9$,$b≤3\times ...

随机推荐

  1. RxJS之组合操作符 ( Angular环境 )

    一 merge操作符 把多个 Observables 的值混合到一个 Observable 中 import { Component, OnInit } from '@angular/core'; i ...

  2. bootstrap-table 使用遇到的问题总结

    问题一:右上角button样式自定义 方法: //修改bootstrap-table右上角按钮样式 $(".table-box .columns-right button").re ...

  3. java_13.2 Object

    1.类 Object 是类层次结构的根类.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个类的方法 2.hashCode()方法 返回该对象的哈希值.一般情况下,该方法会根据对象的 ...

  4. ClickHouse高性能数据库

    ClickHouse之简单性能测试   前面的文章ClickHouse之初步认识已经简单的介绍了ClickHouse,接下来进行简单的性能测试.测试数据来源于美国民用航班的数据,从1987年到2017 ...

  5. ubuntu下sudo apt-get update Sources 404 Not Found 解决方法

    刚安装了ubuntu之后的主要安装命令无非就是apt-get install了,然而很多都在这里就夭折了. 使用apt-get install ***需要先执行apt-get update 加载文件包 ...

  6. BCH/BSV coin split troubleshooting

    BCH/BSV coin split troubleshootingMark Lundeberg 2018 November 27ResourcesGuides:Locktime based spli ...

  7. 面试题集锦;有关作用域和this的指向

    作用域面试题: 1. fn() function fn () { console.log(12) } var as = function () { console.log(45) } 2. var a ...

  8. Oracle性能优化5-索引的不足

    索引的不足 1.索引开销 a.访问开销   反问集中导致热块的竞争(对最新数据的查询)   回表性能取决聚合因子   索引的访问开销,返回几条数据快,但是返回大量的数据很慢   全表扫描与全扫描   ...

  9. c#networkcomms protobuf-net 文件加载出现问题

    服务器端里添加客户管理添加了些功能, 客户端私活连不上了,老程序没问题, 在服务器端程序里边也接受不到事件,客户端就提示链接中断了, 在客户端里边查了 链接中断是客户端上做的,当传回的包为0 事,程序 ...

  10. linux 发送Post请求 json格式

    curl -H "Content-type: application/json" -X POST -d '{"text":"总体来说很不错,环境挺好的 ...