Portal

Description

有一个整数\(x=0\),对其进行\(n(n\leq10^6)\)次操作:

  • 给出\(a(|a|\leq10^9),b(b\leq30n)\),将\(x\)加上\(a\cdot 2^b\)。
  • 询问\(x\)在二进制下位权为\(2^k(k\leq30n)\)的位的值。

保证任意时刻\(x\geq0\)。

Solution

用线段树来模拟二进制下的加减运算。
线段树上的每个位置维护\(30\)位二进制数,即第一位维护\(2^0...2^{29}\),第二位维护\(2^{30}...2^{59}\),以此类推。考虑当我们将某位置上的值修改为\(a\)后应当怎么做:

  • 若\(a\in[0,2^{30})\),则什么也不做。
  • 若\(a\geq2^{30}\),则需要进位:将前面一段连续的\(2^{30}-1\)修改为\(0\),然后将这段\(2^{30}-1\)前面的一个数\(+1\)。
  • 若\(a<0\),则需要退位:将前面一段连续的\(0\)修改为\(2^{30}-1\),然后将这段\(0\)前面的一个数\(-1\)。

那么我们需要区间修改,单点查询,并维护每个区间从低位到高位连续的\(0/2^{30}-1\)的长度。具体细节可以看代码。

时间复杂度\(O(nlogn)\)。

Code

//「NOI2017」整数
#include <cstdio>
#include <cstring>
inline char gc()
{static char now[1<<16],*s,*t;if(s==t) {t=(s=now)+fread(now,1,1<<16,stdin); if(s==t) return EOF;}return *s++;
}
inline int read()
{int x=0,f=1; char ch=gc();while(ch<'0'||'9'<ch) f=(ch^'-')?f:-1,ch=gc();while('0'<=ch&&ch<='9') x=x*10+ch-'0',ch=gc();return x*f;
}
int const N=4e6+10;
int const N0=30;
int n=1e6+100;
int Q,t1,t2,t3;
#define Ls (p<<1)
#define Rs ((p<<1)|1)
int rt,len[2][N],val[N],tag[N];
void update(int p,int L0,int R0)
{int mid=L0+R0>>1;len[0][p]=len[0][Ls]+(len[0][Ls]==mid-L0+1)*len[0][Rs];len[1][p]=len[1][Ls]+(len[1][Ls]==mid-L0+1)*len[1][Rs];
}
void change(int p,int L0,int R0,int x)
{if(x) val[p]=(1<<N0)-1; else val[p]=0;tag[p]=x,len[x][p]=R0-L0+1,len[x^1][p]=0;
}
void pushdw(int p,int L0,int R0)
{if(tag[p]<0) return;int mid=L0+R0>>1;change(Ls,L0,mid,tag[p]),change(Rs,mid+1,R0,tag[p]);tag[p]=-1;
}
int L,R,cyV;
void ins1(int p,int L0,int R0,int v)
{if(L<=L0&&R0<=R){val[p]+=v;if(val[p]>=(1<<N0)) cyV=1,val[p]&=(1<<N0)-1;if(val[p]<0) cyV=0,val[p]+=1<<N0;len[0][p]=len[1][p]=0;if(val[p]==0) len[0][p]=1;if(val[p]==(1<<N0)-1) len[1][p]=1;return;}pushdw(p,L0,R0);int mid=L0+R0>>1;if(L<=mid) ins1(Ls,L0,mid,v);if(mid<R) ins1(Rs,mid+1,R0,v);update(p,L0,R0);
}
void ins2(int p,int L0,int R0,int v)
{if(L<=L0&&R0<=R) {change(p,L0,R0,v); return;}pushdw(p,L0,R0);int mid=L0+R0>>1;if(L<=mid) ins2(Ls,L0,mid,v);if(mid<R) ins2(Rs,mid+1,R0,v);update(p,L0,R0);
}
int query1(int p,int L0,int R0)
{if(L<=L0&&R0<=R) return val[p];pushdw(p,L0,R0);int mid=L0+R0>>1;if(L<=mid) return query1(Ls,L0,mid);if(mid<R) return query1(Rs,mid+1,R0);
}
//query2返回在[L0,R0]∩[L,R]中L向后有多少个连续的v
int query2(int p,int L0,int R0,int v)
{if(L<=L0&&R0<=R) return len[v][p];pushdw(p,L0,R0);int mid=L0+R0>>1,r1=0,r2=0;if(L<=mid) r1=query2(Ls,L0,mid,v);if(mid<R) r2=query2(Rs,mid+1,R0,v);if(L<=mid) return r1+(r1==mid-L+1)*r2;else return r2;
}
void add(int x,int v)
{L=R=x,cyV=-1; ins1(rt,1,n,v);if(cyV>=0){L=x+1,R=n; int len=query2(rt,1,n,cyV);L=x+1,R=x+len; if(L<=R) ins2(rt,1,n,cyV^1);L=R=x+len+1; ins1(rt,1,n,cyV?1:-1);}
}
int main()
{Q=read(); t1=read(),t2=read(),t3=read();memset(tag,-1,sizeof tag);rt=1;change(rt,1,n,0);for(int i=1;i<=Q;i++){int opt=read();if(opt==1){int a=read(),b=read();int b1=b/N0+1,b2=b%N0,t=1<<(N0-b2);int a1=a/t,a2=a%t*(1<<b2);add(b1,a2); add(b1+1,a1);}else{int k=read();int k1=k/N0+1,k2=k%N0;L=R=k1; printf("%d\n",(query1(rt,1,n)>>k2)&1);}}return 0;
}

P.S.

多谢Pickupwin大佬指点

转载于:https://www.cnblogs.com/VisJiao/p/LOJ2302.html

LibreOJ2302 - 「NOI2017」整数相关推荐

  1. loj #2305. 「NOI2017」游戏

    #2305. 「NOI2017」游戏 题目描述 小 L 计划进行 nnn 场游戏,每场游戏使用一张地图,小 L 会选择一辆车在该地图上完成游戏. 小 L 的赛车有三辆,分别用大写字母 AAA.BBB. ...

  2. 「NOI2017」泳池

    DP式子比后面的东西难推多了 LOJ2304 Luogu P3824 UOJ #316 题意 给定一个长度为$ n$高为$ \infty$的矩形 每个点有$ 1-P$的概率不可被选择 求最大的和底边重 ...

  3. 33个神经网络「炼丹」技巧

    点击上方"视学算法","星标"或"置顶" 关键时刻,第一时间送达 本文转载自:机器之心     作者:Andrej Karpathy 特斯拉 ...

  4. 几道 BAT 算法面试中经常问的「字符串」问题

    https://www.toutiao.com/a6675839856192520711/ String 作为最常见的编程语言类型之一,在算法面试中出现的频率极高. 1. 验证回文串 题目来源于 Le ...

  5. 好奇了好久的「对象」,就这?

    作者 | 编程指北 来源 | 编程指北(ID:cs_dev) 别误会,今天要写的不是我对象,毕竟我还没有...... 这篇文章主要是聊聊我对于编程语言中「对象」的一些简单认识, 面向过程 VS 面向对 ...

  6. Loj #3111. 「SDOI2019」染色

    Loj #3111. 「SDOI2019」染色 题目描述 给定 \(2 \times n\) 的格点图.其中一些结点有着已知的颜色,其余的结点还没有被染色.一个合法的染色方案不允许相邻结点有相同的染色 ...

  7. Loj #3055. 「HNOI2019」JOJO

    Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...

  8. 递归循环子组件_算法一看就懂之「 递归 」

    之前的文章咱们已经聊过了 「 数组和链表 」 . 「 堆栈 」 和 「 队列 」 ,今天咱们来看看「 递归 」,当然「 递归 」并不是一种数据结构,它是很多算法都使用的一种编程方法.它太普遍了,并且用 ...

  9. LibreOJ #2006. 「SCOI2015」小凸玩矩阵 二分答案+二分匹配

    #2006. 「SCOI2015」小凸玩矩阵 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 小 ...

最新文章

  1. 重磅升级,52个Python+OpenCV实战项目教你掌握图像处理
  2. 沈南鹏:一个科技主导的新时代已经到来
  3. salesforce 零基础学习(四十二)简单文件上传下载
  4. Node.js Web 模块
  5. 【阿里云MPS】Demo
  6. 80后——后海——烟袋斜街
  7. 玩的时候好好玩,学的时候好好学。不做半吊子
  8. python3.6安装ipython_centos6.5下安装python3.6、pip、ipython
  9. c语言平均绩点_如何靓化你的GPA
  10. 使用TensorFlow.js的AI聊天机器人一:检测文本中的情绪
  11. 【机器人操作系统】ROS话题编程
  12. java中的字符串String的不可变性
  13. 2-SAT 及 一点习题
  14. 20201130-C语言-重新认识ASCII码表
  15. 解决Windows10系统更新后自带的记事本不见了
  16. K3 Cloud 常用数据表整理
  17. java基础之枚举类
  18. 网站CDN加速后对URL中?后的参数跟随问题
  19. android+apk编译器,APK编辑器
  20. C# worksheet设置Excel样式

热门文章

  1. 线段树合并(HDU-5575 Discover Water Tank)
  2. 云体系联盟亮相中国互联网大会,推动产业融合创新
  3. Spring @Value:读取Properties配置文件
  4. 《传热学》王厚华笔记和课后习题答案
  5. 解决T61升级T9300后报“Thermal sensor error”错误
  6. 看到怒飞垂云的 一节课讲明白所有串口协议-Mavlink/ubx/诺瓦泰/NMEA/自定义协议/变帧长/定帧长 也是很有感触
  7. 区块链研究热点和趋势分析
  8. 图片的align属性
  9. python eve mysql_基于python的REST框架eve测试与mongodb的数据操作
  10. AndroidStudio清除无用的资源