题目分析:

首先这题的询问和位(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. Python实现将爱词霸每日一句定时推送至微信

    前言 前几天在网上看到一篇文章<教你用微信每天给女票说晚安>,感觉很神奇的样子,随后研究了一下,构思的确是巧妙.好,那就开始动工吧!服务器有了,Python环境有了,IDE打开了...然而 ...

  2. Python全栈开发之路 【第十八篇】:Ajax技术

    Ajax技术 Ajax = 异步 JavaScript 和 XML. Ajax 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. 1.jQuery的load()方法 jQuery loa ...

  3. 爱奇艺2017秋招笔试(C++智能设备方向)

    虽然有方向,但是好像题目都是随机题库抽取. 选择题都很基础...挖坑,待更新 编程: 一. 奇异数: 如果一个数字满足以下条件,我们就称它为奇异数: 1.   这个数字至少有两位 2. 这个数的最低两 ...

  4. ElasticSearch 分组查询的几个例子

    facets接口可以根据query返回统计数据,其中的 terms_stats 是分组统计,根据key的情况返回value的统计数据,类似group by的意思. "terms_stats& ...

  5. Git远程分支的回退

    下午发现上午提交的一个版本有问题,在回退本地分支后,发现还必须要回退远程分支的版本.网上查找到的资料如下: #新建old_master分支做备份 git branch old_master #push ...

  6. 会议室预订系统(meeting room booking system)

    一.mrbs mrbs:(meeting room booking system) 二.效果   三.models from django.db import models # Create your ...

  7. [转帖]TCP和UDP的135、137、138、139、445端口的作用

    TCP和UDP的135.137.138.139.445端口的作用 https://www.cnblogs.com/IvanChen/p/4500698.html 竟然不知道 端口具体是干什么的.. 如 ...

  8. Notepad++的一个用法 转换为unix 格式的文件

    1. 跟昨天的linux 下面无法执行脚本的blog 一样 今天发现 notepad++ 有一个功能如下图: 双击 就能够选择文件的类型.. 转换为 unix 格式 就可以 在linux 下面执行了. ...

  9. 在Laravel中使用数据库事务以及捕获事务失败后的异常

    Description 在Laravel中要想在数据库事务中运行一组操作,则可以在 DB facade 中使用 transaction 方法.如果在事务的闭包内抛出异常,事务将会被自动还原.如果闭包运 ...

  10. vue.js实战——vue 实时时间

    created:实例创建完成后调用,此阶段完成了数据的观测等,但尚未挂载,$el还不可用,需要初始化处理一些数据时会比较有用. mounted:el挂载到实例上后调用,一般我们的第一个业务逻辑会在这里 ...