$n \leq 1000000$个操作:一,给$x$加上$a*2^b$;二,问$x$的某个二进制位$k$。$b,k \leq 30n$,$|a| \leq 1e9$。

30暴露了一切。。可以把30个二进制位压一位,进位用线段树找到第一个0,而退位用类似的方法找到第一个1。

但其实第$k$位只由加的总量和减的总量的0到$k$这些数位上决定。因此可以把加减分成两个数组,不用再写一个线段树里的减法。回答时查一下$0$到$k-1$中加的和减的孰大孰小,以及第$k$位是否相同,分类可得答案。

这里写的直接模拟。

 //#include<iostream>
#include<cstring>
#include<cstdio>
//#include<math.h>
//#include<set>
//#include<queue>
//#include<bitset>
//#include<vector>
#include<algorithm>
#include<stdlib.h>
using namespace std; #define LL long long
int qread()
{
char c; int s=,f=; while ((c=getchar())<'' || c>'') (c=='-') && (f=-);
do s=s*+c-''; while ((c=getchar())>='' && c<=''); return s*f;
} //Pay attention to '-' , LL and double of qread!!!! int m,n;
#define maxn 1000011
int pos[maxn];
struct SMT
{
struct Node{int ls,rs,v; bool all0,all1,be0,be1;}a[maxn<<];
int size,n;
void up(int x)
{a[x].all0=a[a[x].ls].all0&a[a[x].rs].all0; a[x].all1=a[a[x].ls].all1&a[a[x].rs].all1;}
void build(int &x,int L,int R)
{
x=++size;
a[x].all0=; a[x].all1=a[x].be0=a[x].be1=;
if (L==R) {a[x].v=; pos[L]=x; return;}
int mid=(L+R)>>;
build(a[x].ls,L,mid); build(a[x].rs,mid+,R);
}
void clear(int N) {n=N; size=; int x; build(x,,n);} void besingle(int x,bool t)
{
a[x].all0=a[x].be0=!t;
a[x].all1=a[x].be1=t;
if (t) a[x].v=(<<)-; else a[x].v=;
}
void down(int x)
{
Node &b=a[x];
if (b.be0) {besingle(b.ls,); besingle(b.rs,); b.be0=;}
if (b.be1) {besingle(b.ls,); besingle(b.rs,); b.be1=;}
} bool Add(int x,int L,int R,int p,int v)
{
if (L==R)
{
a[x].v+=v; if (a[x].v>=(<<))
{
a[x].v^=(<<);
a[x].all0=(a[x].v==),a[x].all1=(a[x].v==(<<)-);
return ;
}
a[x].all0=(a[x].v==),a[x].all1=(a[x].v==(<<)-);
return ;
}
down(x);
int mid=(L+R)>>;
if (p<=mid) {bool flag=Add(a[x].ls,L,mid,p,v); up(x); return flag;}
bool flag=Add(a[x].rs,mid+,R,p,v); up(x); return flag;
}
bool f0(int x,int L,int R,int p)
{
if (L==R)
{
bool flag=;
for (int i=;i<;i++) if (((a[x].v>>i)&)==) {a[x].v|=<<i; flag=; break;}
else a[x].v^=(<<i);
a[x].all0=(a[x].v==),a[x].all1=(a[x].v==(<<)-);
return flag;
}
down(x);
int mid=(L+R)>>;
if (L>p)
{
if (a[x].all1) {besingle(x,); return ;}
if (!f0(a[x].ls,L,mid,p)) f0(a[x].rs,mid+,R,p); up(x);
return ;
}
if (mid>p)
{
if (f0(a[x].ls,L,mid,p)) {up(x); return ;}
bool flag=f0(a[x].rs,mid+,R,p); up(x); return flag;
}
if (f0(a[x].rs,mid+,R,p)) {up(x); return ;}
up(x); return ;
}
void add(int p,int v) {p++; if (Add(,,n,p,v) && p!=n) f0(,,n,p);} bool Minus(int x,int L,int R,int p,int v)
{
if (L==R)
{
a[x].v-=v; if (a[x].v<)
{
a[x].v+=(<<);
a[x].all0=(a[x].v==),a[x].all1=(a[x].v==(<<)-);
return ;
}
a[x].all0=(a[x].v==),a[x].all1=(a[x].v==(<<)-);
return ;
}
down(x);
int mid=(L+R)>>;
if (p<=mid) {bool flag=Minus(a[x].ls,L,mid,p,v); up(x); return flag;}
bool flag=Minus(a[x].rs,mid+,R,p,v); up(x); return flag;
}
bool f1(int x,int L,int R,int p)
{
if (L==R)
{
bool flag=;
for (int i=;i<;i++) if (((a[x].v>>i)&)==) {a[x].v^=<<i; flag=; break;}
else a[x].v^=(<<i);
a[x].all0=(a[x].v==),a[x].all1=(a[x].v==(<<)-);
return flag;
}
down(x);
int mid=(L+R)>>;
if (L>p)
{
if (a[x].all0) {besingle(x,); return ;}
if (!f1(a[x].ls,L,mid,p)) f1(a[x].rs,mid+,R,p);
up(x); return ;
}
if (mid>p)
{
if (f1(a[x].ls,L,mid,p)) {up(x); return ;}
bool flag=f1(a[x].rs,mid+,R,p); up(x); return flag;
}
if (f1(a[x].rs,mid+,R,p)) {up(x); return ;}
up(x); return ;
}
void minus(int p,int v) {p++; if (Minus(,,n,p,v) && p!=n) f1(,,n,p);} int Query(int x,int L,int R,int p,int v)
{
if (L==R) return (a[x].v>>v)&;
down(x);
int mid=(L+R)>>;
if (p<=mid) return Query(a[x].ls,L,mid,p,v);
return Query(a[x].rs,mid+,R,p,v);
}
int query(int x) {return Query(,,n,x/+,x%);}
}t; int main()
{
m=qread(); n=qread(); n=qread(); n=qread();
n=;
t.clear(n); int op,x,y;
while (m--)
{
op=qread();
if (op==)
{
x=qread(); y=qread();
if (x>)
{
int p=y/,q=(p+)*-y;
int a=x&((<<q)-),b=x>>q; a<<=y-p*;
t.add(p,a); if (b) t.add(p+,b);
}
else
{
x=-x;
int p=y/,q=(p+)*-y;
int a=x&((<<q)-),b=x>>q; a<<=y-p*;
t.minus(p,a); if (b) t.minus(p+,b);
}
}
else
{
x=qread();
printf("%d\n",t.query(x));
}
}
return ;
}

LOJ#2302. 「NOI2017」整数的更多相关文章

  1. LOJ 2302 「NOI2017」整数——压位线段树

    题目:https://loj.ac/problem/2302 压30位,a最多落在两个位置上,拆成两次操作. 该位置加了 a 之后,如果要进位或者借位,查询一下连续一段 0 / 1 ,修改掉,再在含有 ...

  2. LibreOJ2302 - 「NOI2017」整数

    Portal Description 有一个整数\(x=0\),对其进行\(n(n\leq10^6)\)次操作: 给出\(a(|a|\leq10^9),b(b\leq30n)\),将\(x\)加上\( ...

  3. 「NOI2017」整数 解题报告

    「NOI2017」整数 有一些比较简单的\(\log^2n\)做法 比如暴力在动态开点线段树上维护每个位置为\(0\)还是\(1\),我们发现涉及到某一位加上\(1\)或者减去\(1\)实际上对其他位 ...

  4. loj #2305. 「NOI2017」游戏

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

  5. loj#2305. 「NOI2017」游戏 2-sat

    链接 https://loj.ac/problem/2305 https://www.luogu.org/problemnew/show/P3825 思路 3-sat神马的就不要想了,NP问题 除去x ...

  6. LOJ2302 「NOI2017」整数

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

  7. LOJ 2304 「NOI2017」泳池——思路+DP+常系数线性齐次递推

    题目:https://loj.ac/problem/2304 看了各种题解…… \( dp[i][j] \) 表示有 i 列.第 j 行及以下默认合法,第 j+1 行至少有一个非法格子的概率,满足最大 ...

  8. LOJ 2303 「NOI2017」蚯蚓排队——链表+哈希表

    题目:https://loj.ac/problem/2303 想到合并的时候可以只考虑接口附近的50个,但不太会分析复杂度,而且没有清楚地想到用哈希值对应个数. 看了题解才会…… 一直想用 splay ...

  9. *LOJ#2306. 「NOI2017」蔬菜

    $n \leq 100000$种蔬菜,每个蔬菜有:一单位价格:卖第一单位时额外价格:总量:每天腐烂量.每天能卖$m \leq 10$单位蔬菜,多次询问:前$k \leq 100000$天最多收入多少. ...

随机推荐

  1. MySQL 5.7.20绿色版安装详细图文教程

    MySQL 5.7.20绿色版安装详细图文教程 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle旗下产品.这篇文章主要介绍了MySQL 5.7.20绿色版安装 ...

  2. 【Python学习之五】高级特性4(切片、迭代、列表生成器、生成器、迭代器)

    4.生成器(generator) 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的 ...

  3. Linux常用文档操作命令--2

    4.文档压缩与解压操作 在Linux中常见的压缩文件有:*.tar.gz.*.tgz.*.gz.*.Z.*bz2等.其每种不同的压缩文件对印的压缩和解压命令也不同. *.tar.gz :tar程序打包 ...

  4. NodeJS基础-Buffer

    Buffer用于处理二进制数据流 实例类似于整数数组,大小固定 C++代码在V8堆外分配物理内存 // 创建一个长度为10,且用0填充的Buffer const buf1 = Buffer.alloc ...

  5. 谈谈你对Hibernate的理解

    答: 1. 面向对象设计的软件内部运行过程可以理解成就是在不断创建各种新对象.建立对象之间的关系,调用对象的方法来改变各个对象的状态和对象消亡的过程,不管程序运行的过程和操作怎么样,本质上都是要得到一 ...

  6. asm-offset.h 生成

    转自:https://blog.csdn.net/linglongqiongge/article/details/50008301 http://www.cnblogs.com/wendellyi/p ...

  7. stm32定时器学习二——PWM设置

    /* STM32 嵌入式学习入门(5)——PWM的实现 上一篇博文介绍了定时器和PWM的基本的原理,本篇博文从代码层面来介绍PWM的具体实现.同样,还是以博主所用的开发板——正点原子开发板STM32F ...

  8. python format 用法详解

    format 用法详解 不需要理会数据类型的问题,在%方法中%s只能替代字符串类型 单个参数可以多次输出,参数顺序可以不相同 填充方式十分灵活,对齐方式十分强大 官方推荐用的方式,%方式将会在后面的版 ...

  9. Android CTS - Cannot run program "aapt"/ Fail to run aapt on .../apk installed but AaptParser failed

    今天同事碰到cts的一些问题,跑到某个apk的时候,就提示如下错误: Cannot run program "aapt": error=2. No such file or dir ...

  10. 2015四川省赛 D Vertex Cover 搜索

    题意: 给出一个\(n\)个点\(m\)条边的无向图,现在要给若干个点染色,使得每条边都至少邻接一个被染色的顶点.问至少要给多少各点染色才能满足条件. 分析: 注意到题目中有一个很特殊的条件: 对于图 ...