洛谷3822 [NOI2017] 整数 【线段树】【位运算】
题目分析:
首先这题的询问和位(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] 整数 【线段树】【位运算】的更多相关文章
- [BZOJ4942][Noi2017]整数 线段树+压位
用线段树来模拟加减法过程,维护连续一段中是否全为0/1. 因为数字很大,我们60位压一位来处理. #include<iostream> #include<cstring> #i ...
- 【BZOJ】1012: [JSOI2008]最大数maxnumber /【洛谷】1198(线段树)
Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插 ...
- 【BZOJ4942】[Noi2017]整数 线段树+DFS(卡过)
[BZOJ4942][Noi2017]整数 题目描述去uoj 题解:如果只有加法,那么直接暴力即可...(因为1的数量最多nlogn个) 先考虑加法,比较显然的做法就是将A二进制分解成log位,然后依 ...
- 洛谷P1558 色板游戏 [线段树]
题目传送门 色板游戏 题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, .. ...
- 洛谷题解P4314CPU监控--线段树
题目链接 https://www.luogu.org/problemnew/show/P4314 https://www.lydsy.com/JudgeOnline/problem.php?id=30 ...
- 洛谷P3372/poj3468(线段树lazy_tag)(询问区间和,支持区间修改)
洛谷P3372 //线段树 询问区间和,支持区间修改 #include <cstdio> using namespace std; struct treetype { int l,r; l ...
- 洛谷P4428二进制 [BJOI2018] 线段树
正解:线段树 解题报告: 传送门! 话说开始看到这题的时候我想得hin简单 因为关于%3有个性质就是说一个数的各个位数之和%3=这个数%3嘛,小学基础知识? 我就想着,就直接建一棵树,只是这棵树要用个 ...
- 【洛谷5280】[ZJOI2019] 线段树(线段树大力分类讨论)
点此看题面 大致题意: 给你一棵线段树,两种操作.一种操作将每棵线段树复制成两个,然后在这两个线段树中的一个上面进行\(Modify(l,r)\).另一种操作询问所有线段树的\(tag\)总和. 大力 ...
- 洛谷P1168 中位数——set/线段树
先上一波链接 https://www.luogu.com.cn/problem/P1168 这道题我们有两种写法 第一种呢是线段树,我们首先需要将原本的数据离散化,线段树维护的信息就是区间内有多少个数 ...
随机推荐
- item 24: 区分右值引用和universal引用
本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 古人曾说事情的真相会让你觉得很自在,但是在适当的情 ...
- 自建 Gitlab (邮箱配置、拆分 PostgreSQL、Redis) + 随想
前言 最近折腾了一番自建 gitlab,在此做个记录,供君参考.整个构建过程基于 Docker Swarm(近期有计划将微服务移植到 Kubernetes,但还没倒腾顺手,暂时先沿用旧的方案),主题配 ...
- AtCoder Beginner Contest 122 D - We Like AGC (DP)
D - We Like AGC Time Limit: 2 sec / Memory Limit: 1024 MB Score : 400400 points Problem Statement Yo ...
- 解决object at 0x01DB75F0
python在学习过程中吗,由于常常会出现代码运行没报错,但输出的却不是我们想要的结果(图表,列表等等),而出现类似 <filter object at 0x01DB75F0>的情况,比如 ...
- Vue使用的一些实例
1.实现歌曲的点击切换. <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- 持续集成之Jenkins自动部署war包到远程服务器
一.无war包链接的情况 无war包链接时,需先下载war包到本地,然后执行: ---------------------------------------------以下部分为转载-------- ...
- centos ping www.baidu.com ping: unknown host www.baidu.com
[root@zabbix ~]# cat /etc/resolv.conf ; generated by /sbin/dhclient-script nameserver 219.141.136.10
- 二、npm scripts
一.执行原理 安装npm 包,会将其package.json bin 字段添加到node_modules bin 里面,创建对应的.cmd文件,因此: 例如: "scripts": ...
- Hbase API
- 《笔记》Python itertools的groupby分组数据处理
今天遇到这么一个需求,需要将这样的数据进行分组处理: [(, ), (, ), (, ), (, ), (, ), (, )] 处理之后我可能需要得到这样的结果: [(, (, , (, , (, ) ...