https://www.lydsy.com/JudgeOnline/problem.php?id=4942

http://uoj.ac/problem/314

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

题面是markdown形式的所以我传不上……

UPD:18.5.11改成对参考代码的理解失误。

参考:http://www.cnblogs.com/RabbitHu/p/UOJ314.html仔细思考之后发现lazy标记可以不下传,因为区间修改都是改0/INF,单点修改就直接改就行了……

(晚上睡前突然发现这个sb问题然后太晚了只好现在改。)

暴力修改显然是不行的。

考虑让你改的是a*2^b,已经明示了想让你直接修改二进制位,于是把a用O(log)时间拆成二进制然后log次加减,期间的进位退位问题用参考博客的方法可以O(log)实现。

但问题是位数一共有3e7……显然会T的。

于是压60位,这样时间复杂度就有保证了。

(我记得以前有人批评松松松就是因为他WC出神题然后NOI出签到题……woc我怕不是送分题都做不出来我退役吧。)

#include<cstdio>
#include<queue>
#include<cctype>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=5e5+;
const int B=;
const ll INF=(1LL<<B)-;
inline ll read(){
ll X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
ll lazy[N*+],val[N*+];
int pos[N*+];
bool tag[N*+][];
inline void upt(int a){
tag[a][]=tag[a<<][]&tag[a<<|][];
tag[a][]=tag[a<<][]&tag[a<<|][];
}
inline void mdy(int a,ll x){
if(pos[a]!=-)val[pos[a]]=x;
if(x==)tag[a][]=,tag[a][]=;
else if(x==INF)tag[a][]=,tag[a][]=;
else tag[a][]=tag[a][]=;
lazy[a]=x;
}
inline void push(int a){
if(lazy[a]==-)return;
mdy(a<<,lazy[a]);
mdy(a<<|,lazy[a]);
lazy[a]=-;
}
void build(int a,int l,int r){
tag[a][]=;lazy[a]=-;pos[a]=-;
if(l==r){
pos[a]=l;
return;
}
int mid=(l+r)>>;
build(a<<,l,mid);build(a<<|,mid+,r);
}
void modify(int a,int l,int r,int l1,int r1,ll x){
if(r<l1||r1<l||l1>r1)return;
if(l1<=l&&r<=r1){
mdy(a,x);
return;
}
push(a);
int mid=(l+r)>>;
modify(a<<,l,mid,l1,r1,x);
modify(a<<|,mid+,r,l1,r1,x);
upt(a);
}
ll query(int a,int l,int r,int p){
if(l==r)return val[l];
push(a);
int mid=(l+r)>>;
if(p<=mid)return query(a<<,l,mid,p);
else return query(a<<|,mid+,r,p);
}
int find(int a,int l,int r,int p,int o){
if(tag[a][!o])return -;
if(l==r)return l;
push(a);
int mid=(l+r)>>,tmp;
if(p<=mid&&(tmp=find(a<<,l,mid,p,o))!=-)return tmp;
return find(a<<|,mid+,r,p,o);
}
void add(int p,ll x){
ll tmp=query(,,N,p);
modify(,,N,p,p,(tmp+x)&INF);
if(tmp+x>INF){
int r=find(,,N,p+,);
modify(,,N,r,r,val[r]+);
modify(,,N,p+,r-,);
}
}
void del(int p,ll x){
ll tmp=query(,,N,p);
modify(,,N,p,p,(tmp-x)&INF);
if(tmp-x<){
int r=find(,,N,p+,);
modify(,,N,r,r,val[r]-);
modify(,,N,p+,r-,INF);
}
}
int main(){
int n=read();read(),read(),read();
build(,,N);
for(int i=;i<=n;i++){
int op=read();
if(op==){
ll a=read(),b=read();
ll p=b/B,m=b%B;
if(a>){
ll x=(ll)a<<m&INF;
if(x)add(p,x);
p++;a>>=(B-m);
if(a)add(p,a);
}else{
a=-a;
ll x=(ll)a<<m&INF;
if(x)del(p,x);
p++;a>>=(B-m);
if(a)del(p,a);
}
}else{
ll k=read();
printf("%lld\n",query(,,N,k/B)>>(k%B)&);
}
}
return ;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/ +

+++++++++++++++++++++++++++++++++++++++++++

BZOJ4942 & UOJ314:[NOI2017]整数——题解的更多相关文章

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

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

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

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

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

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

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

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

  5. NOI2017整数

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

  6. C#版 - Leetcode 13. 罗马数字转整数 - 题解

    C#版 - Leetcode 13. 罗马数字转整数 - 题解 Leetcode 13. Roman to Integer 在线提交: https://leetcode.com/problems/ro ...

  7. [NOI2017]整数

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

  8. BZOJ4942【noi2017】整数

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

  9. [BZOJ4942] [NOI2017]整数

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

随机推荐

  1. hdu1596find the safest road(floyd)

    find the safest road Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  2. 使用postman实现半自动化

    前些日子项目要上一个活动,其中有一个功能是幸运大转盘,用户可以随机抽奖,奖品有多种满减券及多种商品,但是奖品都是有抽中概率的,且有的商品还设置有库存,所以测试点便是测试抽奖的概率和库存.接下来拆分一下 ...

  3. Unity Lighting - Choosing a Lighting Technique 选择照明技术(一)

      Choosing a Lighting Technique 选择照明技术 https://unity3d.com/cn/learn/tutorials/topics/graphics/choosi ...

  4. Java学习 · 初识 容器和数据结构

    容器和数据结构 1.   集合的引入 a)     集合的使用场景:需要将一些相同结构的个体整合到一起时 i.           新闻列表 ii.           邮件列表 iii.       ...

  5. Paper Reading - CNN+CNN: Convolutional Decoders for Image Captioning

    Link of the Paper: https://arxiv.org/abs/1805.09019 Innovations: The authors propose a CNN + CNN fra ...

  6. isX字符串方法

    islower():返回True,如果字符串至少有一个字母,并且所有字母都是小写: 例如:>>> spam='Hello world' >>> spam.islow ...

  7. 基于深度学习的中文语音识别系统框架(pluse)

    目录 声学模型 GRU-CTC DFCNN DFSMN 语言模型 n-gram CBHG 数据集 本文搭建一个完整的中文语音识别系统,包括声学模型和语言模型,能够将输入的音频信号识别为汉字. 声学模型 ...

  8. LeetCode - 459. Repeated Substring Pattern - O(n)和O(n^2)两种思路 - KMP - (C++) - 解题报告

    题目 题目链接 Given a non-empty string check if it can be constructed by taking a substring of it and appe ...

  9. 零基础自学人工智能,看这些资料就够了(300G资料免费送)

    为什么有今天这篇? 首先,标题不要太相信,哈哈哈. 本公众号之前已经就人工智能学习的路径.学习方法.经典学习视频等做过完整说明.但是鉴于每个人的基础不同,可能需要额外的学习资料进行辅助.特此,向大家免 ...

  10. 【转】c++面试基础

    1,关于动态申请内存 答:内存分配方式三种: (1)从静态存储区域分配:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在. 全局变量,static变量. (2)在栈上创建:在执行函 ...