NOI2017 整数

题意:

​ 让你实现两个操作:

  • 1 \(a\) \(b\):将\(x\)加上整数\(a \cdot 2 ^ b\),其中 \(a\)为一个整数,\(b\)为一个非负整数
  • 2 \(k\):询问 \(x\)在用二进制表示时,位权为\(2 ^ k\)的位的值(即这一位上的\(1\)代表\(2 ^ k\))

​ 一百万次操作,$ |a| \leq 10^9,b,k\leq30n$。

题解:

​ 线段树+压位,30位一位,没了

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #define fo(i,l,r) for(int i=l;i<=r;i++)
  6. #define of(i,l,r) for(int i=l;i>=r;i--)
  7. #define fe(i,u) for(int i=head[u];i;i=e[i].next)
  8. using namespace std;
  9. typedef long long ll;
  10. inline void open(const char *s)
  11. {
  12. #ifndef ONLINE_JUDGE
  13. char str[20];
  14. sprintf(str,"in%s.txt",s);
  15. freopen(str,"r",stdin);
  16. // sprintf(str,"out%s.txt",s);
  17. // freopen(str,"w",stdout);
  18. #endif
  19. }
  20. inline int rd()
  21. {
  22. static int x,f;
  23. x=0;f=1;
  24. char ch=getchar();
  25. for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
  26. for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
  27. return f>0?x:-x;
  28. }
  29. const int N=1000010,n=N-2,B=30,S=(1<<B)-1;
  30. int m,rt;
  31. namespace Seg{
  32. #define lson tr[o].ls,l,mid
  33. #define rson tr[o].rs,mid+1,r
  34. #define qlson lson,L,min(mid,R)
  35. #define qrson rson,max(mid+1,L),R
  36. struct tree{
  37. int ls,rs,val0,val1,tag;//1 or 0 and
  38. tree(){ls=rs=val0=val1=0;tag=-1;}
  39. }tr[N<<1];int cnt=0;
  40. void build(int &o,int l,int r)
  41. {
  42. o=++cnt;
  43. if(l==r)return;
  44. int mid=(l+r)>>1;
  45. build(lson);
  46. build(rson);
  47. }
  48. inline void pushup(int o)
  49. {
  50. tr[o].val1=tr[tr[o].ls].val1|tr[tr[o].rs].val1;
  51. tr[o].val0=tr[tr[o].ls].val0&tr[tr[o].rs].val0;
  52. }
  53. inline void pushdown(int o)
  54. {
  55. if(!~tr[o].tag)return;
  56. int ls=tr[o].ls,rs=tr[o].rs;
  57. tr[ls].val0=tr[ls].val1=tr[ls].tag=tr[o].tag;
  58. tr[rs].val0=tr[rs].val1=tr[rs].tag=tr[o].tag;
  59. tr[o].tag=-1;
  60. }
  61. int find1(int o,int l,int r,int x)
  62. {
  63. if(tr[o].val0==S)return -1;
  64. if(l==r)return l;
  65. pushdown(o);
  66. int mid=(l+r)>>1,res=-1;
  67. if(x<=mid)res=find1(lson,x);
  68. if(~res)return res;
  69. return find1(rson,x);
  70. }
  71. int find0(int o,int l,int r,int x)
  72. {
  73. if(!tr[o].val1)return -1;
  74. if(l==r)return l;
  75. pushdown(o);
  76. int mid=(l+r)>>1,res=-1;
  77. if(x<=mid)res=find0(lson,x);
  78. if(~res)return res;
  79. return find0(rson,x);
  80. }
  81. void updata(int o,int l,int r,int x,int d)
  82. {
  83. if(l==r)return tr[o].val0+=d,tr[o].val1+=d,void();
  84. pushdown(o);
  85. int mid=(l+r)>>1;
  86. if(x<=mid)updata(lson,x,d);
  87. else updata(rson,x,d);
  88. pushup(o);
  89. }
  90. void paint(int o,int l,int r,int L,int R,int d)
  91. {
  92. if(l==L&&r==R)return tr[o].tag=tr[o].val0=tr[o].val1=d,void();
  93. pushdown(o);
  94. int mid=(l+r)>>1;
  95. if(L<=mid)paint(qlson,d);
  96. if(R>mid)paint(qrson,d);
  97. pushup(o);
  98. }
  99. int query(int o,int l,int r,int x)
  100. {
  101. if(l==r)return tr[o].val0;
  102. pushdown(o);
  103. int mid=(l+r)>>1;
  104. if(x<=mid)return query(lson,x);
  105. return query(rson,x);
  106. }
  107. }
  108. inline void inc(int p,int x)
  109. {
  110. static int res,y;
  111. // printf("%d %d\n",p,x);
  112. res=Seg::query(rt,0,n,p);
  113. if(res+x<=S)return Seg::updata(rt,0,n,p,x);
  114. Seg::updata(rt,0,n,p,x-S-1);
  115. y=Seg::find1(rt,0,n,p+1);
  116. // printf("%d\n",y);
  117. if(y>p+1)Seg::paint(rt,0,n,p+1,y-1,0);
  118. Seg::updata(rt,0,n,y,1);
  119. }
  120. inline void dec(int p,int x)
  121. {
  122. static int res,y;
  123. // printf("%d %d\n",p,x);
  124. res=Seg::query(rt,0,n,p);
  125. if(res-x>=0)return Seg::updata(rt,0,n,p,-x);
  126. Seg::updata(rt,0,n,p,S-x+1);
  127. y=Seg::find0(rt,0,n,p+1);
  128. // printf("%d\n",y);
  129. if(y>p+1)Seg::paint(rt,0,n,p+1,y-1,S);
  130. Seg::updata(rt,0,n,y,-1);
  131. }
  132. inline void gao1()
  133. {
  134. static int x,y,p;
  135. x=rd();y=rd();p=y/B;
  136. if(x>0){
  137. inc(p,(x<<(y-p*B))&S);
  138. inc(p+1,x>>(B-y+p*B));
  139. }
  140. else{
  141. x=-x;
  142. dec(p,(x<<(y-p*B))&S);
  143. dec(p+1,x>>(B-y+p*B));
  144. }
  145. }
  146. inline void gao2()
  147. {
  148. static int x,p,res;
  149. x=rd();p=x/B;
  150. res=Seg::query(rt,0,n,p);
  151. if(res&(1<<(x-p*B)))puts("1");
  152. else puts("0");
  153. }
  154. int main()
  155. {
  156. m=rd();rd();rd();rd();
  157. Seg::build(rt,0,n);
  158. while(m--){
  159. int ty=rd();
  160. if(ty==1)gao1();
  161. else gao2();
  162. }
  163. return 0;
  164. }

NOI2017整数的更多相关文章

  1. [NOI2017]整数

    [NOI2017]整数 题目大意: \(n(n\le10^6)\)次操作维护一个长度为\(30n\)的二进制整数\(x\),支持以下两种操作: 将这个整数加上\(a\cdot2^b(|a|\le10^ ...

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

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

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

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

  4. 【BZOJ4942】[NOI2017]整数(分块)

    [BZOJ4942][NOI2017]整数(分块) 题面 BZOJ 洛谷 题解 暴力就是真正的暴力,直接手动模拟进位就好了. 此时复杂度是模拟的复杂度加上单次询问的\(O(1)\). 所以我们需要优化 ...

  5. 【bzoj4942】[Noi2017]整数 压位+线段树

    题目描述 P 博士将他的计算任务抽象为对一个整数的操作. 具体来说,有一个整数 $x$ ,一开始为0. 接下来有 $n$ 个操作,每个操作都是以下两种类型中的一种: 1 a b :将 $x$ 加上整数 ...

  6. [BZOJ4942] [NOI2017]整数

    题目背景 在人类智慧的山巅,有着一台字长为1048576位(此数字与解题无关)的超级计算机,著名理论计算机科 学家P博士正用它进行各种研究.不幸的是,这天台风切断了电力系统,超级计算机 无法工作,而 ...

  7. BZOJ.4942.[NOI2017]整数(分块)

    BZOJ 洛谷 UOJ 可能是退役之前最后一个BZOJ rank1了? 参考这里. 如果没有减法,对一个二进制数暴力进位,均摊复杂度是\(O(1)\)的(要进\(O(n)\)次位就至少需要\(O(n) ...

  8. 洛谷3822 [NOI2017] 整数 【线段树】【位运算】

    题目分析: 首先这题的询问和位(bit)有关,不难想到是用线段树维护位运算. 现在我们压32位再来看这道题. 对于一个加法操作,它的添加位置可以得到,剩下的就是做不超过32的位移.这样根据压位的理论. ...

  9. BZOJ4942 NOI2017整数(线段树)

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

随机推荐

  1. MySql系列之表的数据类型

    存储引擎介绍 存储引擎即表类型,mysql根据不同的表类型会有不同的处理机制 什么是存储引擎 mysql中建立的库===>文件夹 库中建立的表===>文件 现实生活中我们用来存储数据的文件 ...

  2. [NOIP2009提高组]最优贸易

    题目:洛谷P1073.Vijos P1754.codevs1173. 题目大意:有n点m边的图,边分有向和无向.每个点有一个价格,用这个价格可以买入或卖出一个东西.一个人从1出发,要到n,途中可以买入 ...

  3. 使用U盘作为启动盘安装ubuntu系统

     一.使用U盘刻录镜像 1.安装之后我们打开软件,点击文件打开,找到我们刚才进行下载的Ubuntu的ISO文件,然后点击打开,完成ISO文件的加载.接着我们插入U盘,点击UltraISO启动选项,然后 ...

  4. 认识Vue组件

    前言 Vue.js是一套构建用户界面的渐进式框架(官方说明).通俗点来说,Vue.js是一个轻量级的,易上手易使用的,便捷,灵活性强的前端MVVM框架.简洁的API,良好健全的中文文档,使开发者能够较 ...

  5. 帆软FineBI试用

    FineBI是帆软软件有限公司推出的一款商业智能(Business Intelligence)产品,FineBI的本质是通过分析企业已有的信息化数据,帮助企业发现并解决存在的问题,预测模拟企业将来的发 ...

  6. fork函数详解

    一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同, ...

  7. typedef 与 set_new_handler的几种写法

    可以用Command模式.函数对象来代替函数指针,获得以下的好处: 1. 可以封装数据 2. 可以通过虚拟成员获得函数的多态性 3. 可以处理类层次结果,将Command与Prototype模式相结合 ...

  8. 同一个事务里 查询 已删除可是未提交的数据[bug记录]

    前几天犯了个低级错误.在一个事务方法里老是查询不到某条记录,可是debug卡住时,用db工具查.又能查出值. 经过一番折腾,原来是我在同一个事务里 查询 了已删除可是未提交的数据.当然查询不到了! . ...

  9. 浅谈 C 语言中模块化设计的范式

    今天继续谈模块化的问题.这个想慢慢写成个系列,但是不一定连续写.基本是想起来了,就整理点思路出来.主要还是为以后集中整理做点铺垫. 我们都知道,层次分明的代码最容易维护.你可以轻易的换掉某个层次上的某 ...

  10. 在Windows上如何安装和彻底卸载Adobe Flash Player教程

    很多小伙伴在安装水晶易表的时候,经常会遇到“Xcelsius2008需要使用Adobe Flash Player(9.151或者更高版本)”报错问题,如下图所示. 导致安装进程受阻,此时就需要安装高版 ...