[bzoj4942]整数
考虑暴力,即需要考虑如何实现$\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]整数的更多相关文章
- 【BZOJ4942】[Noi2017]整数 线段树+DFS(卡过)
[BZOJ4942][Noi2017]整数 题目描述去uoj 题解:如果只有加法,那么直接暴力即可...(因为1的数量最多nlogn个) 先考虑加法,比较显然的做法就是将A二进制分解成log位,然后依 ...
- 【BZOJ4942】[NOI2017]整数(分块)
[BZOJ4942][NOI2017]整数(分块) 题面 BZOJ 洛谷 题解 暴力就是真正的暴力,直接手动模拟进位就好了. 此时复杂度是模拟的复杂度加上单次询问的\(O(1)\). 所以我们需要优化 ...
- BZOJ4942【noi2017】整数
题目背景 在人类智慧的山巅,有着一台字长为10485761048576 位(此数字与解题无关)的超级计算机,著名理论计算机科 学家P博士正用它进行各种研究.不幸的是,这天台风切断了电力系统,超级计算机 ...
- 【bzoj4942】[Noi2017]整数 压位+线段树
题目描述 P 博士将他的计算任务抽象为对一个整数的操作. 具体来说,有一个整数 $x$ ,一开始为0. 接下来有 $n$ 个操作,每个操作都是以下两种类型中的一种: 1 a b :将 $x$ 加上整数 ...
- [BZOJ4942] [NOI2017]整数
题目背景 在人类智慧的山巅,有着一台字长为1048576位(此数字与解题无关)的超级计算机,著名理论计算机科 学家P博士正用它进行各种研究.不幸的是,这天台风切断了电力系统,超级计算机 无法工作,而 ...
- [Bzoj4942][Noi2017]整数(线段树)
4942: [Noi2017]整数 Time Limit: 50 Sec Memory Limit: 512 MBSubmit: 363 Solved: 237[Submit][Status][D ...
- BZOJ4942 NOI2017整数(线段树)
首先把每32位压成一个unsigned int(当然只要压起来能过就行).如果不考虑进/退位的话,每次只要将加/减上去的数拆成两部分直接单点修改就好了.那么考虑如何维护进/退位.可以发现进位的过程其实 ...
- 2018.10.30 bzoj4942: [Noi2017]整数(线段树压位)
传送门 直接把修改的数拆成logloglog个二进制位一个一个修改是会TLETLETLE的. 因此我们把303030个二进制位压成一位储存在线段树里面. 然后维护区间中最靠左二进制位不为0/1的下标. ...
- [Noi2017]整数 BZOJ4942
分析: 30+暴力应该还是蛮水的,可以随便写写... 60+的就没那么容易了,但是应该挺裸的,往上架一颗线段树,查询连续1或0的长度,或者找到前缀中,第一个1或0,之后区间覆盖,单点查询,开bool, ...
随机推荐
- 零基础怎么学Java?Java的运行机制是什么?Java入门基础!
Java语言是当前流行的一种程序设计语言,因其安全性.平台无关性.性能优异等特点,受到广大编程爱好者的喜爱. 想学习Java语言的同学对于Java的运行机制是必须要了解的!! 计算机高级语言的类型主要 ...
- 【分享】 一款自用的Anki卡片模板:黄子涵单词卡片 v1
[分享] 一款自用的Anki卡片模板:黄子涵单词卡片 v1 说明 第一代的功能 主要有两部分组成:英文和含义,目前主要是为自己记忆Web前端一些常用的单词而服务 有美美哒背景图,本来想修改为随机背景图 ...
- 手摸手教你用 yapi-to-typescript生成Yapi的TypeScript数据类型
一 背景 现代社会比较重视效率,本着这个思想宗旨,能用工具自动高效做的事情,就不要低质量的勤奋.yapi-to-typescript就是一款自动生成接口请求与响应的typescript数据类型定义的工 ...
- LuckySheet一款在线Excel使用心得
1.LuckySheet简介 Luckysheet ,是一款国产的纯JS实现的类似excel的在线表格,功能强大.配置简单.完全开源. 开源地址 https://gitee.com/mengshuke ...
- Python使用阿里云OSS服务
Python使用阿里云OSS服务 前言: 在远程搭建了一个平台,通过改远程平台进行数据的采集,需要将数据内容传送至本地进行处理:为了实现该功能,考虑了阿里云的OSS对象储存的服务. 40G包月只需1元 ...
- 记一次关于pdf 下载需求变更到 pdf 在线预览
背景: 之前的需求是根据接口中提供的Blob数据实现PDF下载,已实现代码如下: 1 const url = window.URL.createObjectURL(newBlob([response. ...
- 2021.6.29考试总结[NOIP模拟10]
T1 入阵曲 二位前缀和暴力n4可以拿60. 观察到维护前缀和时模k意义下余数一样的前缀和相减后一定被k整除,前缀和维护模数,n2枚举行数,n枚举列, 开一个桶记录模数出现个数,每枚举到该模数就加上它 ...
- 预备知识-python核心用法常用数据分析库(上)
1.预备知识-python核心用法常用数据分析库(上) 目录 1.预备知识-python核心用法常用数据分析库(上) 概述 实验环境 任务一:环境安装与配置 [实验目标] [实验步骤] 任务二:Pan ...
- 单片机I/O口推挽与开漏输出详解(力荐)
推挽输出:可以输出高,低电平,连接数字器件;推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止. 开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电 ...
- 单片机STM32开发中常用库函数分析
1.GPIO初始化函数 用法: voidGPIO_Configuration(void) { GPIO_InitTypeDefGPIO_InitStructure;//GPIO状态恢复默认参数 GPI ...