考虑暴力,即需要考虑如何实现$\pm 2^{k}$,相当于要找到之后的第一个0或者之前的第一个1(维护区间是否全0/1即可),然后区间重置,可以用线段树维护,复杂度为$o(900n)$(a的划分和线段树),无法通过
但由于数据范围很大,这样过不了,可以想到压位,每30位二进制压为一个数,那么复杂度降为$o(30n)$(因为a只要划分为最多两个数)且常数变小,可以通过

  1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 1000100
4 #define L (k<<1)
5 #define R (L+1)
6 #define mid (l+r>>1)
7 #define S (1<<30)
8 int n,p,x,y,f[N],laz[N<<2],pos[N<<2],vis[N<<2][2];
9 int pd(int k){
10 if (!k)return 0;
11 if (k==S-1)return 1;
12 return -1;
13 }
14 void build(int k,int l,int r){
15 laz[k]=-1;
16 vis[k][0]=1;
17 if (l==r){
18 pos[k]=l;
19 return;
20 }
21 build(L,l,mid);
22 build(R,mid+1,r);
23 }
24 void upd(int k,int x){
25 laz[k]=x;
26 if (x<0){
27 vis[k][0]=vis[k][1]=0;
28 return;
29 }
30 if (pos[k])f[pos[k]]=x*(S-1);
31 vis[k][x]=1;
32 vis[k][x^1]=0;
33 }
34 void up(int k){
35 vis[k][0]=(vis[L][0]&vis[R][0]);
36 vis[k][1]=(vis[L][1]&vis[R][1]);
37 }
38 void down(int k){
39 if (laz[k]<0)return;
40 upd(L,laz[k]);
41 upd(R,laz[k]);
42 laz[k]=-1;
43 }
44 void update(int k,int l,int r,int x,int y,int z){
45 if ((l>y)||(x>r))return;
46 if ((x<=l)&&(r<=y)){
47 upd(k,z);
48 return;
49 }
50 down(k);
51 update(L,l,mid,x,y,z);
52 update(R,mid+1,r,x,y,z);
53 up(k);
54 }
55 int find(int k,int l,int r,int x,int y){
56 if ((r<=x)||(vis[k][y]))return 0;
57 if (l==r)return l;
58 down(k);
59 int p=find(L,l,mid,x,y);
60 if (p)return p;
61 return find(R,mid+1,r,x,y);
62 }
63 int query(int k,int l,int r,int x){
64 if (l==r)return f[l];
65 down(k);
66 if (x<=mid)return query(L,l,mid,x);
67 return query(R,mid+1,r,x);
68 }
69 void add(int x,int y){
70 if (query(1,1,N,x)+y<S){
71 update(1,1,N,x,x,pd(f[x]+=y));
72 return;
73 }
74 update(1,1,N,x,x,pd(f[x]+=y-S));
75 int p=find(1,1,N,x,1);
76 update(1,1,N,x+1,p-1,0);
77 query(1,1,N,p);
78 update(1,1,N,p,p,pd(++f[p]));
79 }
80 void del(int x,int y){
81 if (query(1,1,N,x)>=y){
82 update(1,1,N,x,x,pd(f[x]-=y));
83 return;
84 }
85 update(1,1,N,x,x,pd(f[x]+=S-y));
86 int p=find(1,1,N,x,0);
87 update(1,1,N,x+1,p-1,1);
88 query(1,1,N,p);
89 update(1,1,N,p,p,pd(--f[p]));
90 }
91 int main(){
92 scanf("%d%*d%*d%*d",&n);
93 build(1,1,N);
94 while (n--){
95 scanf("%d%d",&p,&x);
96 if (p==2)printf("%d\n",(query(1,1,N,x/30+1)>>(x%30))&1);
97 else{
98 scanf("%d",&y);
99 if (x>0){
100 add(y/30+1,(x*(1LL<<(y%30))%S));
101 add(y/30+2,(x*(1LL<<(y%30))/S));
102 }
103 else{
104 x*=-1;
105 del(y/30+1,(x*(1LL<<(y%30))%S));
106 del(y/30+2,(x*(1LL<<(y%30))/S));
107 }
108 }
109 }
110 }

[bzoj4942]整数的更多相关文章

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

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

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

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

  3. BZOJ4942【noi2017】整数

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

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

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

  5. [BZOJ4942] [NOI2017]整数

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

  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. 2018.10.30 bzoj4942: [Noi2017]整数(线段树压位)

    传送门 直接把修改的数拆成logloglog个二进制位一个一个修改是会TLETLETLE的. 因此我们把303030个二进制位压成一位储存在线段树里面. 然后维护区间中最靠左二进制位不为0/1的下标. ...

  9. [Noi2017]整数 BZOJ4942

    分析: 30+暴力应该还是蛮水的,可以随便写写... 60+的就没那么容易了,但是应该挺裸的,往上架一颗线段树,查询连续1或0的长度,或者找到前缀中,第一个1或0,之后区间覆盖,单点查询,开bool, ...

随机推荐

  1. 题解 [NOI2014]购票

    题目传送门 题目大意 有一个 \(n\) 个点的树,每个点有三个值 \(p_u,q_u,l_u\) ,现在可以从 \(u\) 走到点 \(v\) 当且仅当 \(v\) 是 \(u\) 的祖先并且 \( ...

  2. Visual Studio CMake 项目和 WSL

    Visual Studio CMake 项目和 WSL https://devblogs.microsoft.com/cppblog/c-with-visual-studio-2019-and-win ...

  3. 【Java虚拟机5】Java内存模型(硬件层面的并发优化基础知识--指令乱序问题)

    前言 其实之前大家都了解过volatile,它的第一个作用是保证内存可见,第二个作用是禁止指令重排序.今天系统学习下为什么CPU会指令重排. 存储器的层次结构图 1.CPU乱序执行指令的根源 CPU读 ...

  4. 【UE4 C++ 基础知识】<9> Interface 接口

    概述 简单的说,接口提供一组公共的方法,不同的对象中继承这些方法后可以有不同的具体实现. 任何使用接口的类都必须实现这些接口. 实现解耦 解决多继承的问题 蓝图使用 使用方法 三种调用方法的区别 调用 ...

  5. Netty学习笔记(1)NIO三大组件

    1. Channel channel 有一点类似于 stream,它就是读写数据的双向通道,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前 ...

  6. 通过Nacos动态刷新Spring Cloud Gateway的路由

    通过Nacos动态刷新Spring Cloud Gateway的路由 一.背景 二.解决方案 三.实现功能 四.实现步骤 1.网关服务的实现 1.pom文件 2.bootstrap.yml配置文件 3 ...

  7. 乘风破浪,遇见上一代操作系统Windows 10 - 抢鲜尝试安装新微软商店(Microsoft Store)

    背景 在微软官方文章的<十一项关于微软商店新知>中提到: 新的微软商店现在可在Windows 11上找到,我们很高兴地分享,它将在未来几个月内提供给Windows 10客户!我们将很快分享 ...

  8. 一套比较好用的公众号UI框架-weui

    最近工作原因 需要在pd端弄一套js类似bootstrap框架 由于使用环境是在公众号终端用的比较多! 类似上面这样的样式 所以我从微信官方开始找起 最后找到了WEUI 还别说 真的挺好用的 这是大佬 ...

  9. 通过Envoy实现.NET架构的网关

    什么是Gateway 在微服务体系结构中,如果每个微服务通常都会公开一组精细终结点,这种情况可能会有以下问题 如果没有 API 网关模式,客户端应用将与内部微服务相耦合. 在客户端应用中,单个页面/屏 ...

  10. Linux内核漏洞精准检测如何做?SCA工具不能只在软件层面

    摘要:二进制SCA工具要想更好的辅助安全人员实现安全审计.降低漏洞检测的误报率,必须向更细颗粒度的检测维度发展,而不仅仅停留在开源软件的层面,同时对漏洞库的要求也需要向细颗粒度的精准信息提出的挑战. ...