题目分析:

首先这题的询问和位(bit)有关,不难想到是用线段树维护位运算。

现在我们压32位再来看这道题。

对于一个加法操作,它的添加位置可以得到,剩下的就是做不超过32的位移。这样根据压位的理论。它最多只会对线段树的两个叶子产生影响,我们分开来考虑两个叶子。

对于一个加法的进位,它实际就是把它之后连续的全为1的位赋值成0,然后更改第一个不是全为1的位,不难想到用lazytag实现。

减法操作与加法操作相反。所以我们要两个标记和两个lazy标记。

对于一个询问,在线段树上查找即可。

代码:

 #include<bits/stdc++.h>
using namespace std; const int base = ; int n,maxx; struct SEGT{
unsigned int dt;
bool lazy0,lazy1;
bool all0,all1;
}T[(<<)]; void build_tree(int now,int l,int r){
T[now].all0 = ;
if(l == r) return;
int mid = (l+r)/;
build_tree(now<<,l,mid);
build_tree(now<<|,mid+,r);
} void push_down0(int now){
T[now<<].all0 = ; T[now<<].all1 = ;
T[now<<].lazy0 = ; T[now<<].lazy1 = ;
T[now<<|].all0 = ; T[now<<|].all1 = ;
T[now<<|].lazy0 = ; T[now<<|].lazy1 = ;
T[now<<].dt = ; T[now<<|].dt = ; T[now].lazy0 = ;
} void push_down1(int now){
T[now<<].all1 = ; T[now<<].all0 = ;
T[now<<].lazy1 = ; T[now<<].lazy0 = ;
T[now<<|].all1 = ; T[now<<|].all0 = ;
T[now<<|].lazy1 = ; T[now<<|].lazy0 = ;
T[now<<].dt = (1ll<<)-; T[now<<|].dt = (1ll<<)-; T[now].lazy1 = ;
} void push_up(int now){
if(T[now<<].all0 && T[now<<|].all0) T[now].all0 = ; else T[now].all0 = ;
if(T[now<<].all1 && T[now<<|].all1) T[now].all1 = ; else T[now].all1 = ;
} void leafpd(int now){
if(T[now].dt == ) T[now].all0 = ; else T[now].all0 = ;
if(T[now].dt == (1ll<<)-) T[now].all1 = ; else T[now].all1 = ;
} int tag = ;
void uppaint(int now,int tl,int tr,int place){
if(tl != tr && T[now].lazy0) push_down0(now);
if(tl != tr && T[now].lazy1) push_down1(now);
if(tl >= place){
if(T[now].all1){
T[now].all0 = ;T[now].all1 = ;
T[now].lazy0 = ;T[now].lazy1 = ;
T[now].dt = ;
return;
}else{
if(tl == tr){T[now].dt++;tag = ;leafpd(now);return;}
int mid = (tl+tr)/;
uppaint(now<<,tl,mid,place);
if(!tag) uppaint(now<<|,mid+,tr,place);
push_up(now);
}
}else{
int mid = (tl+tr)/;
if(place > mid) uppaint(now<<|,mid+,tr,place);
else{
uppaint(now<<,tl,mid,place);
if(!tag) uppaint(now<<|,mid+,tr,place);
}
push_up(now);
}
} void downpaint(int now,int tl,int tr,int place){
if(tl != tr && T[now].lazy0) push_down0(now);
if(tl != tr && T[now].lazy1) push_down1(now);
if(tl >= place){
if(T[now].all0){
T[now].all1 = ;T[now].all0 = ;
T[now].lazy1 = ;T[now].lazy0 = ;
T[now].dt = (1ll<<)-;
return;
}else{
if(tl == tr){T[now].dt--;tag=;leafpd(now);return;}
int mid = (tl+tr)/;
downpaint(now<<,tl,mid,place);
if(!tag) downpaint(now<<|,mid+,tr,place);
push_up(now);
}
}else{
int mid = (tl+tr)/;
if(place > mid) downpaint(now<<|,mid+,tr,place);
else{
downpaint(now<<,tl,mid,place);
if(!tag) downpaint(now<<|,mid+,tr,place);
}
push_up(now);
}
} void TModify(int now,int tl,int tr,int place,long long data){
if(tl == tr){
if(data >= ){
long long res = data + T[now].dt;
T[now].dt = (res&((1ll<<)-));
if(res >= (1ll<<)){ tag = ;uppaint(,,n,place+);}
}else{
long long res = T[now].dt + data;
if(res >= ) T[now].dt = res;
else{
T[now].dt = res + (1ll<<);
tag = ;downpaint(,,n,place+);
}
}
leafpd(now);
return;
}
if(T[now].lazy0) push_down0(now);
if(T[now].lazy1) push_down1(now);
int mid = (tl+tr)/;
if(place <= mid) TModify(now<<,tl,mid,place,data);
else TModify(now<<|,mid+,tr,place,data);
push_up(now);
} void Modify(){
int dr,data,bit; scanf("%d%d",&data,&bit);
if(data < ) dr = -; else dr = ;
data = abs(data);
int a1 = bit>>,a2 = bit&;
if((1ll*data<<a2) >= (1ll<<)){
long long fw = 1ll*data<<a2;
TModify(,,n,a1,(fw&((1ll<<)-))*dr);
fw >>= ;
TModify(,,n,a1+,fw*dr);
}else{
TModify(,,n,a1,(1ll*data<<a2)*dr);
}
} int QTree(int now,int tl,int tr,int place,int bit){
if(T[now].all0) return ; if(T[now].all1) return ;
if(tl == tr){ if(T[now].dt & (<<bit)) return ; else return ; }
int mid = (tl+tr)/;
if(place <= mid) return QTree(now<<,tl,mid,place,bit);
else return QTree(now<<|,mid+,tr,place,bit);
} void Query(){
int kth; scanf("%d",&kth);
int a1 = kth>>,a2 = kth&;
printf("%d\n",QTree(,,n,a1,a2));
} void work(){
for(int i=;i<=n;i++){
int cas; scanf("%d",&cas);
if(cas == ){Modify();}
else Query();
}
} int main(){
scanf("%d",&n); int x; scanf("%d%d%d",&x,&x,&x);
build_tree(,,n);
work();
return ;
}

洛谷3822 [NOI2017] 整数 【线段树】【位运算】的更多相关文章

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

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

  2. 【BZOJ】1012: [JSOI2008]最大数maxnumber /【洛谷】1198(线段树)

    Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插 ...

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

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

  4. 洛谷P1558 色板游戏 [线段树]

    题目传送门 色板游戏 题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, .. ...

  5. 洛谷题解P4314CPU监控--线段树

    题目链接 https://www.luogu.org/problemnew/show/P4314 https://www.lydsy.com/JudgeOnline/problem.php?id=30 ...

  6. 洛谷P3372/poj3468(线段树lazy_tag)(询问区间和,支持区间修改)

    洛谷P3372 //线段树 询问区间和,支持区间修改 #include <cstdio> using namespace std; struct treetype { int l,r; l ...

  7. 洛谷P4428二进制 [BJOI2018] 线段树

    正解:线段树 解题报告: 传送门! 话说开始看到这题的时候我想得hin简单 因为关于%3有个性质就是说一个数的各个位数之和%3=这个数%3嘛,小学基础知识? 我就想着,就直接建一棵树,只是这棵树要用个 ...

  8. 【洛谷5280】[ZJOI2019] 线段树(线段树大力分类讨论)

    点此看题面 大致题意: 给你一棵线段树,两种操作.一种操作将每棵线段树复制成两个,然后在这两个线段树中的一个上面进行\(Modify(l,r)\).另一种操作询问所有线段树的\(tag\)总和. 大力 ...

  9. 洛谷P1168 中位数——set/线段树

    先上一波链接 https://www.luogu.com.cn/problem/P1168 这道题我们有两种写法 第一种呢是线段树,我们首先需要将原本的数据离散化,线段树维护的信息就是区间内有多少个数 ...

随机推荐

  1. mysql自增id超大问题查询

    引言 小A正在balabala写代码呢,DBA小B突然发来了一条消息,"快看看你的用户特定信息表T,里面的主键,也就是自增id,都到16亿了,这才多久,在这样下去过不了多久主键就要超出范围了 ...

  2. IDEA安装Lombok插件失败的解决方案

    作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. Lombok简介 Lombok是Java语言的实用工具,确切的说,应 ...

  3. 腾讯 Omi 5.0 发布 - Web 前端 MVVM 王者归来,mappingjs 强力加持

    写在前面 腾讯 Omi 框架正式发布 5.0,依然专注于 View,但是对 MVVM 架构更加友好的集成,彻底分离视图与业务逻辑的架构. 你可以通过 omi-cli 快速体验 MVVM: $ npm ...

  4. SQL SERVER按多字段查找重复的数据并删除只保留一条

    由于一次操作失误,给表中插入了多条重复的数据,所以就需要删除重复的数据只保留一条,一时想不到好方法,各种查资料,终于找到了,特意写到这里,方便以后自己用~ 查询: select A.n_PatentI ...

  5. python3 pip 安装Scrapy在win10 安装报错error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools

    问题描述 当前环境win10,python_3.6.1,64位. 在windows下,在dos中运行pip install Scrapy报错: building 'twisted.test.raise ...

  6. Redis服务端的搭建(初级)

    前方低能,仅适合入门级菜鸟阅读,大神大牛通通闪开! 前言:redis经常被用来做缓存(原因自行科普),基于学习的需要自己搭建了一个redis服务器,考虑到项目的分布式部署,所以前期开始的时候,redi ...

  7. 阿里云服务器使用镜像市场上的环境以后sql不能远程问题

    关于阿里云的服务器,首先要说的就是买了以后是没有环境的,什么都需要自己配置,也是在这个上面栽了很多跟头最后去的镜像市场买的一个IIS8+SQL2016的asp.net环境 怎么说呢,感觉有些问题的本源 ...

  8. p151开映射札记

    1. 如何理解这句话? 2.连续有什么用? 3.为什么区间包含,经过算子T还是包含? 谢谢 谢谢学长 我懂了  1.2.     3有点儿模糊 1.连续等价于开集原像是开集,而可逆算子的逆的原像就是的 ...

  9. dynamo与cassandra区别

    虽说cassandra是dynamo的开源版本,但两者还是有很大区别的. coordinator的选取: 在dynamo论文中,一般是preference list中N个副本的第一个 为什么叫“一般” ...

  10. centos安装bundle文件

    centos安装VMware-Workstation-Full-*.bundle那点事 | 鳗鱼是条狗https://kinggoo.com/centos-vmware.htm Linux 下 VMW ...