洛谷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 这道题我们有两种写法 第一种呢是线段树,我们首先需要将原本的数据离散化,线段树维护的信息就是区间内有多少个数 ...
随机推荐
- 小记Java时间工具类
小记Java时间工具类 废话不多说,这里主要记录以下几个工具 两个时间只差(Data) 获取时间的格式 格式化时间 返回String 两个时间只差(String) 获取两个时间之间的日期.月份.年份 ...
- Vue(四)之webpack和vue-cli
01-webpack介绍 官方文档:https://www.webpackjs.com/concepts/ 本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(modu ...
- vue2.0之axios使用详解
axios 基于 Promise 的 HTTP 请求客户端,可同时在浏览器和 node.js 中使用 功能特性 在浏览器中发送 XMLHttpRequests 请求 在 node.js 中发送 htt ...
- A-Text Reverse(文本反向读)
多组数据测试,输入t,表示要测几个,每个语句反向输出. 链接 [https://cn.vjudge.net/contest/235390#problem/A] 解: 就是getchar()和gets( ...
- c++入门之 再话类
对于类,其结构并不难,但要理解其设计思想也并不容易,在此,我们可以通过下面的代码进一步理解和使用类: # ifndef VECTOR_H_ # define VECTOR_H_ # include & ...
- 现有n 个乱序数,都大于 1000 ,让取排行榜前十,时间复杂度为o(n), top10, 或者 topK,应用场景榜单Top:10,堆实现Top k
一.topK python实现 def topk(k, lst): top = [0 for i in range(k)] #生成一个长度为K 的有序列表 for item in lst: #循环 ...
- beego 自定义控制器与路由
框架浅析 这是之前使用bee创建的webapp目录层级结构: ├── conf 配置文件 │ └── app.conf ├── controllers 控制器 │ └── default.go ├── ...
- 【学习总结】C-翁恺老师-入门-第3周<循环>
[学习总结]C-翁恺老师-入门-总 1-求一个整数的位数:引入循环while 注:循环体内要有改变循环的机会,要不然就死循环了啊! 注:手写推测程序是否正确. 注:测试程序-边界:个位数.10.0.负 ...
- asp.net mvc Dateset读取Excel数据
//处理Excel //读取Excel [NonAction] public static DataSet ExcelToDS(string Path) { //根据情况选择合适的连接字符,参考msd ...
- windows端玩转docker笔记
启动docker安装目录下的start.sh------我是windows系统端 1.搜一下资源 docker search ubuntu 2.下载镜像 docker pull ubuntu 3 ...