luogu的题面

https://www.luogu.org/problemnew/show/P3822

题意:
     x初始为0,维护+a*2^k ,其中a为整数,k为自然数;查询x的第k位;

题解:
    ①将数看成序列,线段树逐位维护。比较大,压位(下面的代码base=30,ls()
rs()为左右儿子)。

    ②输入1,a,b,即将b/base号节点加 (a<<b%base)的base位以内部分,b/base+1号节点加 (a<<b%base)base位以上的部分。

    ③假设我们已经找到了b对应的叶子节点,修改后考虑进位。定义fg1[k]表示k节点是否是最大值(1<<base)-1,b对应的叶子往上跳一层到k号节点,如果fg1[rs(k)]==false,直接rs(k)里进位就好了,否则把rs(k)清零,再往上跳,退位同理(写的时候记得pushdown和pushup 。。。。TAT);

 #pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
//#define N 1000100
//#define base 30
#define ll long long
#define ls(k) (k<<1)
#define rs(k) (ls(k)|1)
using namespace std;
const ll base=,N=4.2e7/base,B=(<<base)-,len=4.1e7/base;
//const int B = (1<<base) - 1,len = 1e6 + 5;
int n,t1,t2,t3;
int w[N<<],fg1[N<<],fg0[N<<],ly1[N<<],ly0[N<<];
char gc(){
static char *p1,*p2,s[];
if(p1==p2) p2=(p1=s)+fread(s,,,stdin);
return(p1==p2)?EOF:*p1++;
}
int rd(){
int x = ,f = ; char c = gc();
while(c<''||c>'') {if(c=='-') f = -; c = gc();}
while(c>=''&&c<='') {x = x * + c - ''; c = gc();}
return x * f;
}
void pushup(int k){
int l = ls(k),r = rs(k);
fg0[k] = fg0[l] && fg0[r];
fg1[k] = fg1[l] && fg1[r];
}
void mdf(int k,int typ){
w[k] = B * typ;
fg1[k] = ly1[k] = typ;
fg0[k] = ly0[k] = !typ;
}
void pushdown(int k){
int l = ls(k),r = rs(k);
if(ly0[k]) mdf(l,),mdf(r,),ly0[k] = ;
if(ly1[k]) mdf(l,),mdf(r,),ly1[k] = ;
}
void change(int k,int l,int r,int typ){
if(l==r) {
w[k]+=typ;
fg0[k] = !w[k];
fg1[k] = (w[k]==B);
}
else{
if(ly0[k]||ly1[k]) pushdown(k);
int mid = (l+r)>>;
if(typ==){
if(!fg1[ls(k)]) change(ls(k),l,mid,);
else mdf(ls(k),),change(rs(k),mid+,r,);
}
else{
if(!fg0[ls(k)]) change(ls(k),l,mid,-);
else mdf(ls(k),),change(rs(k),mid+,r,-);
}
pushup(k);
}
}
int update(int k,int l,int r,int x,int y){
if(!y) return ;
int typ = ;
if(l==r) {
w[k] += y;
if(w[k]>=(<<base)) w[k] -= (<<base),typ = ;
else if(w[k]<) w[k] += (<<base),typ = -;
fg0[k] = !w[k];
fg1[k] = (w[k]==B);
}
else {
if(ly0[k]||ly1[k]) pushdown(k);
int mid = (l + r)>>;
if(x<=mid){
typ = update(ls(k),l,mid,x,y);
if(typ==) {
if(!fg1[rs(k)]) typ = ,change(rs(k),mid+,r,);
else mdf(rs(k),);
}
if(typ==-){
if(!fg0[rs(k)]) typ = ,change(rs(k),mid+,r,-);
else mdf(rs(k),);
}
}
else typ = update(rs(k),mid+,r,x,y);
pushup(k);
}
return typ;
}
int query(int k,int l,int r,int x,int y){
if(l==r) return bool(w[k]&y);
else {
if(ly0[k]||ly1[k]) pushdown(k);
int mid = (l + r)>>;
if(x<=mid) return query(ls(k),l,mid,x,y);
else return query(rs(k),mid+,r,x,y);
}
}
int main()
{ //freopen("mzoj1111.in","r",stdin);
//freopen("mzoj1111.out","w",stdout);
n = rd(); t1 = rd(); t2 = rd(); t3 = rd();
fg0[] = ly0[] = ;
for(int i = ;i <= n;i++){
ll opt = rd(),f,a,b,x,y;
if(opt&){
a = rd(); b = rd();
if(a<) a*=-,f=-; else f=;
a <<= (b%base); b /= base;
update(,,len,b,f*(a&B));
update(,,len,b+,f*(a>>base));
}
else{
x = rd();
y = <<(x%base); x /= base;
int ans = query(,,len,x,y);
printf("%d\n",ans);
}
}
return ;
}//by tkys_Austin;

BZOJ4942【noi2017】整数的更多相关文章

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

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

  2. [BZOJ4942] [NOI2017]整数

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

  3. BZOJ4942 NOI2017整数(线段树)

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

  4. 2018.10.30 bzoj4942: [Noi2017]整数(线段树压位)

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

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

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

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

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

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

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

  8. [NOI2017]整数

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

  9. NOI2017整数

    NOI2017 整数 题意: ​ 让你实现两个操作: 1 \(a\) \(b\):将\(x\)加上整数\(a \cdot 2 ^ b\),其中 \(a\)为一个整数,\(b\)为一个非负整数 2 \( ...

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

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

随机推荐

  1. 【iOS】swift init构造器

    这几天在使用 Swift 重写原来的一个运动社交应用 SportJoin. 为什么要重写呢? 首先因为实在找不到设计师给我作图; 其次, 我也闲不下来, 想找一些项目做, 所以只好将原来的代码重写了. ...

  2. zookeeper安装及环境变量设置

    下载 首先去官网下载(自行选择版本):http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.11/然后执行tar -zxvf解压 对于后台安装 ...

  3. JAVA_SE基础——3.Java程序的开发流程

    上一篇,写的是JAVA的环境变量的配置,今天我抽空写篇Java程序的开发流程,下面的教程是我结合书本和毕向东老师的视频写下的心的~ 在没有真正写Java程序前,首先需要了解Java程序的开发过程. S ...

  4. python 中os.path.join 双斜杠的解决办法

    这两天在写东西的时候遇到了这个问题,主要是上传图片之后,无法在页面展示,原因就出在用join 拼接的路径中出现了"\"而造成的. >>> import os &g ...

  5. JS刷题总结

    多总结,才能更好地进步,分享下最近的刷题总结给大家吧 关于缩减代码 1.善用js中的函数或者特性. (迭代.解构.set等等) //使用箭头函数缩减代码 //处理输入,可以用.map,需要注意其所有参 ...

  6. elk调试环境

    http://10.110.22.30:9100/

  7. 三十天学不会TCP,UDP/IP网络编程 -- RTT的计算

    欢迎去gitbook(https://www.gitbook.com/@rogerzhu/)看到完整版. 如果对和程序员有关的计算机网络知识,和对计算机网络方面的编程有兴趣,虽然说现在这种“看不见”的 ...

  8. Android 学习资料入门到精通(PDF集合)共54本

    最近收集一些安卓入门到精通,包含游戏编程,网络编程,多媒体开发,需要学习朋友就下载保持下来,下载链接在最下面 下面是网盘内容 14天学会安卓开发_(完整版).pdf Android 4  游戏高级编程 ...

  9. 理解Node.js安装及模块化

    1.安装Node Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效. Node.j ...

  10. 使用WSUS离线下载补丁并安装在非联网的windows系统中(以Windows Server 2008 r2为例)

    首先我失去https://serverfault.com/questions/322938/finding-and-downloading-all-available-win2008-r2-and-w ...