用线段树来模拟加减法过程,维护连续一段中是否全为0/1。

因为数字很大,我们60位压一位来处理。

 #include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<cstdio>
#include<algorithm>
#define maxn 505050
#define base 60
#define ll long long
using namespace std;
inline ll read() {
ll x=,f=;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-;
for(;isdigit(ch);ch=getchar()) x=x*+ch-'';
return x*f;
}
ll n,m,S=(1ll<<)-;
struct Seg {
int al[];
ll tag,val;
}t[maxn*];
void put(int o,ll tmp) {
if(tmp!=-) t[o].val=tmp;
if(tmp==) {t[o].al[]=;t[o].al[]=;t[o].tag=tmp;}
else if(tmp==S) {t[o].al[]=;t[o].al[]=;t[o].tag=tmp;}
else {t[o].al[]=t[o].al[]=;t[o].tag=tmp;}
}
void pushdown(int o) {
int ls=o<<,rs=ls+;
if(t[o].tag!=-) {put(ls,t[o].tag);put(rs,t[o].tag);t[o].tag=-;}
}
void pushup(int o) {
int ls=o<<,rs=ls+;
t[o].al[]=t[ls].al[]&t[rs].al[];
t[o].al[]=t[ls].al[]&t[rs].al[];
}
void build(int l,int r,int o) {
t[o].tag=-,t[o].al[]=;t[o].al[]=;t[o].val=;
if(l==r) return;
int mid=l+r>>,ls=o<<,rs=ls+;
build(l,mid,ls);build(mid+,r,rs);
}
ll query(int l,int r,int o,int x) {
if(l==r) return t[o].val;
pushdown(o);
int mid=l+r>>,ls=o<<,rs=ls+;
if(x<=mid) return query(l,mid,ls,x);
else return query(mid+,r,rs,x);
pushup(o);
}
void change(int l,int r,int o,int L,int R,ll tmp) {
if(L<=l&&R>=r) {put(o,tmp);return;}
pushdown(o);
int mid=l+r>>,ls=o<<,rs=ls+;
if(L<=mid) change(l,mid,ls,L,R,tmp);
if(R>mid) change(mid+,r,rs,L,R,tmp);
pushup(o);
}
int find(int l,int r,int o,int pos,int k) {
if(t[o].al[!k]) return -;
if(l==r) return l;
int mid=l+r>>,ls=o<<,rs=ls+;
pushdown(o);
if(pos<=mid) {
ll tmp=find(l,mid,ls,pos,k);
if(tmp!=-) return tmp;
}
return find(mid+,r,rs,pos,k);
pushup(o);
}
void add(int pos,ll ad) {
ll tmp=query(,n,,pos);change(,n,,pos,pos,(tmp+ad)&S);
if(tmp+ad>S) {
int l=find(,n,,pos+,);
tmp=query(,n,,l);
change(,n,,l,l,tmp+);
if(pos+<=l-) change(,n,,pos+,l-,);
}
}
void del(int pos,ll ad) {
ll tmp=query(,n,,pos);
if(tmp-ad<) change(,n,,pos,pos,(S+tmp-ad+)&S);
else change(,n,,pos,pos,(tmp-ad)&S);
if(tmp-ad<) {
int l=find(,n,,pos+,);
tmp=query(,n,,l);
change(,n,,l,l,tmp-);
if(pos+<=l-) change(,n,,pos+,l-,S);
}
}
int main() {
m=read();read();read();read();n=;build(,n,);
for(int i=;i<=m;i++) {
int tp=read();
if(tp==) {
ll a=read(),b=read();
if(a>) {
ll p=b/base,q=b%base;
ll x=(a<<q)&S;add(p,x);
a>>=base-q;add(p+,a);
}
else {
a=-a;ll p=b/base,q=b%base;
ll x=(a<<q)&S;del(p,x);
a>>=base-q;del(p+,a);
}
}
else {
ll a=read();
printf("%lld\n",(query(,n,,a/base)>>(a%base))&);
}
}
}
/*
10 3 1 2
1 100 0
1 2333 0
1 -233 0
2 5
2 7
2 15
1 5 15
2 15
1 -1 12
2 15
*/

[BZOJ4942][Noi2017]整数 线段树+压位的更多相关文章

  1. UOJ #314. 【NOI2017】整数 | 线段树 压位

    题目链接 UOJ 134 题解 可爱的电音之王松松松出的题--好妙啊. 首先想一个朴素的做法! 把当前的整数的二进制当作01序列用线段树维护一下(序列的第i位就是整数中位权为\(2^k\)的那一位). ...

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

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

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

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

  4. 【洛谷3822】[NOI2017] 整数(线段树压位)

    题目: 洛谷 3822 分析: 直接按题意模拟,完了. 将每次加 / 减拆成不超过 \(32\) 个对单独一位的加 / 减. 考虑给一个二进制位(下称「当前位」)加 \(1\) 时,如果这一位本来就是 ...

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

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

  6. BZOJ4942 NOI2017整数(线段树)

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

  7. noi2017 T1 整数 ——线段树

    loj.ac上有  题目传送门 不过我还是把题目搬过来吧 整数(integer)[题目背景]在人类智慧的山巅,有着一台字长为 1048576 位的超级计算机,著名理论计算机科 学家 P 博士正用它进行 ...

  8. 【noi2017】 整数 线段树or模拟

    ORZYYB 题目大意:你需要维护一个有$3\times 10^7$个二进制位的数,有一种修改方式和一种询问方式 对这个数加上$a\times2^b$,其中$|a|≤10^9$,$b≤3\times ...

  9. BZOJ4946[Noi2017]蔬菜——线段树+堆+模拟费用流

    题目链接: [Noi2017]蔬菜 题目大意:有$n$种蔬菜,每种蔬菜有$c_{i}$个,每种蔬菜每天有$x_{i}$个单位会坏掉(准确来说每天每种蔬菜坏掉的量是$x_{i}-$当天这种蔬菜卖出量), ...

随机推荐

  1. poj1204 Word Puzzles

    Word Puzzles Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 12090   Accepted: 4547   S ...

  2. ECONNRESET和WSAECONNRESET怎么产生的以及如何避免

    ECONNRESET是linux环境网络编程产生的错误,错误码为104, WSAECONNRESET是windows环境网络编程产生的错误,错误码为10054 两者产生的原因都一样,分以下几种情况: ...

  3. HAOI2017游记

    HACF的最终成绩已经出炉,但是事情还没有结束. 好多想说的,不知道从何说起,就按照时间顺序说吧. 考前 考前大概一周半就开始复习了,一些比较重要的算法,比如KDT,单纯性,线性基等等没有再继续学,所 ...

  4. 只出现一次的数字 [ LeetCode ]

    给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1: 输入: [ ...

  5. ThinkPHP+Memcache的缓存方案总结

    简介: ThinkPHP用S()方法可以缓存数据,这在访问数据库时非常有用,可以在有限时间内当数据库无变化时从缓存取数据,有变化时从数据库取数据. Memcached+Memcache是一个将数据保存 ...

  6. 【整理】explain、type、extra用法和结果的含义

    EXPLAIN列详情 详细解读:https://www.cnblogs.com/yycc/p/7338894.html explain显示了mysql如何使用索引来处理select语句以及连接表.可以 ...

  7. spring boot 2.0.3+spring cloud (Finchley)4、熔断器Hystrix

    在分布式系统中服务与服务之间的依赖错综复杂,一种不可避免的情况就是某些服务会出现故障,导致依赖于他们的其他服务出现远程调度的线程阻塞.某个服务的单个点的请求故障会导致用户的请求处于阻塞状态,最终的结果 ...

  8. [USACO07FEB] Lilypad Pond

    https://www.luogu.org/problem/show?pid=1606 题目描述 FJ has installed a beautiful pond for his cows' aes ...

  9. 拓扑排序 最大字典序+优先队列 BZOJ 4010

    http://www.lydsy.com/JudgeOnline/problem.php?id=4010 4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec  Memory ...

  10. 贪心法:K叉哈夫曼树

    NOI2015荷马史诗 一部<荷马史诗>中有 n 种不同的单词,从 1 到 n 进行编号.其中第 i 种单词出现的总次数为 wi.Allison 想要用 k 进制串 si 来替换第 i 种 ...