BZOJ4942【noi2017】整数
luogu的题面
https://www.luogu.org/problemnew/show/P3822
题意:
x初始为0,维护+a*2^k ,其中a为整数,k为自然数;查询x的第k位;
题解:
①将数看成序列,线段树逐位维护。比较大,压位(下面的代码base=30,ls() rs()为左右儿子)。
②输入1,a,b,即将b/base号节点加 (a<<b%base)的base位以内部分,b/base+1号节点加 (a<<b%base)base位以上的部分。
③假设我们已经找到了b对应的叶子节点,修改后考虑进位。定义fg1[k]表示k节点是否是最大值(1<<base)-1,b对应的叶子往上跳一层到k号节点,如果fg1[rs(k)]==false,直接rs(k)里进位就好了,否则把rs(k)清零,再往上跳,退位同理(写的时候记得pushdown和pushup 。。。。TAT);
#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
//#define N 1000100
//#define base 30
#define ll long long
#define ls(k) (k<<1)
#define rs(k) (ls(k)|1)
using namespace std;
const ll base=,N=4.2e7/base,B=(<<base)-,len=4.1e7/base;
//const int B = (1<<base) - 1,len = 1e6 + 5;
int n,t1,t2,t3;
int w[N<<],fg1[N<<],fg0[N<<],ly1[N<<],ly0[N<<];
char gc(){
static char *p1,*p2,s[];
if(p1==p2) p2=(p1=s)+fread(s,,,stdin);
return(p1==p2)?EOF:*p1++;
}
int rd(){
int x = ,f = ; char c = gc();
while(c<''||c>'') {if(c=='-') f = -; c = gc();}
while(c>=''&&c<='') {x = x * + c - ''; c = gc();}
return x * f;
}
void pushup(int k){
int l = ls(k),r = rs(k);
fg0[k] = fg0[l] && fg0[r];
fg1[k] = fg1[l] && fg1[r];
}
void mdf(int k,int typ){
w[k] = B * typ;
fg1[k] = ly1[k] = typ;
fg0[k] = ly0[k] = !typ;
}
void pushdown(int k){
int l = ls(k),r = rs(k);
if(ly0[k]) mdf(l,),mdf(r,),ly0[k] = ;
if(ly1[k]) mdf(l,),mdf(r,),ly1[k] = ;
}
void change(int k,int l,int r,int typ){
if(l==r) {
w[k]+=typ;
fg0[k] = !w[k];
fg1[k] = (w[k]==B);
}
else{
if(ly0[k]||ly1[k]) pushdown(k);
int mid = (l+r)>>;
if(typ==){
if(!fg1[ls(k)]) change(ls(k),l,mid,);
else mdf(ls(k),),change(rs(k),mid+,r,);
}
else{
if(!fg0[ls(k)]) change(ls(k),l,mid,-);
else mdf(ls(k),),change(rs(k),mid+,r,-);
}
pushup(k);
}
}
int update(int k,int l,int r,int x,int y){
if(!y) return ;
int typ = ;
if(l==r) {
w[k] += y;
if(w[k]>=(<<base)) w[k] -= (<<base),typ = ;
else if(w[k]<) w[k] += (<<base),typ = -;
fg0[k] = !w[k];
fg1[k] = (w[k]==B);
}
else {
if(ly0[k]||ly1[k]) pushdown(k);
int mid = (l + r)>>;
if(x<=mid){
typ = update(ls(k),l,mid,x,y);
if(typ==) {
if(!fg1[rs(k)]) typ = ,change(rs(k),mid+,r,);
else mdf(rs(k),);
}
if(typ==-){
if(!fg0[rs(k)]) typ = ,change(rs(k),mid+,r,-);
else mdf(rs(k),);
}
}
else typ = update(rs(k),mid+,r,x,y);
pushup(k);
}
return typ;
}
int query(int k,int l,int r,int x,int y){
if(l==r) return bool(w[k]&y);
else {
if(ly0[k]||ly1[k]) pushdown(k);
int mid = (l + r)>>;
if(x<=mid) return query(ls(k),l,mid,x,y);
else return query(rs(k),mid+,r,x,y);
}
}
int main()
{ //freopen("mzoj1111.in","r",stdin);
//freopen("mzoj1111.out","w",stdout);
n = rd(); t1 = rd(); t2 = rd(); t3 = rd();
fg0[] = ly0[] = ;
for(int i = ;i <= n;i++){
ll opt = rd(),f,a,b,x,y;
if(opt&){
a = rd(); b = rd();
if(a<) a*=-,f=-; else f=;
a <<= (b%base); b /= base;
update(,,len,b,f*(a&B));
update(,,len,b+,f*(a>>base));
}
else{
x = rd();
y = <<(x%base); x /= base;
int ans = query(,,len,x,y);
printf("%d\n",ans);
}
}
return ;
}//by tkys_Austin;
BZOJ4942【noi2017】整数的更多相关文章
- [Bzoj4942][Noi2017]整数(线段树)
4942: [Noi2017]整数 Time Limit: 50 Sec Memory Limit: 512 MBSubmit: 363 Solved: 237[Submit][Status][D ...
- [BZOJ4942] [NOI2017]整数
题目背景 在人类智慧的山巅,有着一台字长为1048576位(此数字与解题无关)的超级计算机,著名理论计算机科 学家P博士正用它进行各种研究.不幸的是,这天台风切断了电力系统,超级计算机 无法工作,而 ...
- BZOJ4942 NOI2017整数(线段树)
首先把每32位压成一个unsigned int(当然只要压起来能过就行).如果不考虑进/退位的话,每次只要将加/减上去的数拆成两部分直接单点修改就好了.那么考虑如何维护进/退位.可以发现进位的过程其实 ...
- 2018.10.30 bzoj4942: [Noi2017]整数(线段树压位)
传送门 直接把修改的数拆成logloglog个二进制位一个一个修改是会TLETLETLE的. 因此我们把303030个二进制位压成一位储存在线段树里面. 然后维护区间中最靠左二进制位不为0/1的下标. ...
- [BZOJ4942][Noi2017]整数 线段树+压位
用线段树来模拟加减法过程,维护连续一段中是否全为0/1. 因为数字很大,我们60位压一位来处理. #include<iostream> #include<cstring> #i ...
- 【BZOJ4942】[Noi2017]整数 线段树+DFS(卡过)
[BZOJ4942][Noi2017]整数 题目描述去uoj 题解:如果只有加法,那么直接暴力即可...(因为1的数量最多nlogn个) 先考虑加法,比较显然的做法就是将A二进制分解成log位,然后依 ...
- 【BZOJ4942】[NOI2017]整数(分块)
[BZOJ4942][NOI2017]整数(分块) 题面 BZOJ 洛谷 题解 暴力就是真正的暴力,直接手动模拟进位就好了. 此时复杂度是模拟的复杂度加上单次询问的\(O(1)\). 所以我们需要优化 ...
- [NOI2017]整数
[NOI2017]整数 题目大意: \(n(n\le10^6)\)次操作维护一个长度为\(30n\)的二进制整数\(x\),支持以下两种操作: 将这个整数加上\(a\cdot2^b(|a|\le10^ ...
- NOI2017整数
NOI2017 整数 题意: 让你实现两个操作: 1 \(a\) \(b\):将\(x\)加上整数\(a \cdot 2 ^ b\),其中 \(a\)为一个整数,\(b\)为一个非负整数 2 \( ...
- 【bzoj4942】[Noi2017]整数 压位+线段树
题目描述 P 博士将他的计算任务抽象为对一个整数的操作. 具体来说,有一个整数 $x$ ,一开始为0. 接下来有 $n$ 个操作,每个操作都是以下两种类型中的一种: 1 a b :将 $x$ 加上整数 ...
随机推荐
- 201621123043 《Java程序设计》第6周学习总结
1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰,内容覆盖面向对象的 ...
- 201621123043 《Java程序设计》第2周学习总结
1.本周学习总结 使用jdk文档查阅函数功能及代码 用switch语句是在每个case中可能在第一行是sc.nextLine;来给回车赋值: 在使用循环的时候要注意循环返回的条件,否则陷入死循环可能会 ...
- margin-top导致父标签偏移问题
从一个大神博客中看到这句话: 这个问题发生的原因是根据规范,一个盒子如果没有上补白(padding-top)和上边框(border-top),那么这个盒子的上边距会和其内部文档流中的第一个子元素的上边 ...
- LeetCode & Q27-Remove Element-Easy
Array Two Pointers Description: Given an array and a value, remove all instances of that value in pl ...
- rsync 自动创建目录的坑点
rsync同步文件有三种模式: 1.把源站路径下某个文件,同步到目标路径.例如rsync -aR /data/1/2/3/a.txt 1.1.1.1:/data/ ,目标机器将自动创建多层目录存放a. ...
- C# 使用 ffmpeg 进行音频转码
先放一下 ffmpeg 的官方文档以及下载地址: 官方文档:http://ffmpeg.org/ffmpeg.html 下载地址:http://ffmpeg.org/download.html 用 f ...
- C#之Socket通信
0.虽然之前在项目中也有用过Socket,但始终不是自己搭建的,所以对Server,Clinet端以及心跳,断线重连总没有很深入的理解,现在自己搭建了一遍加深一下理解. 服务端使用WPF界面,客户端使 ...
- 关于PHP7
目前一直使用php7也看了许多文档视频等,整理一下相关细节(仅为记录-),对于PHP7性能,如下图所示. * 在wordpress3.0.1中 php7比php5.6性能提升约3倍左右 新特性 一.变 ...
- 新概念英语(1-123)A trip to Australia
Who is the man with the beard?(胡须)A:Look, Scott. This is a photograph I took during my trip to Austr ...
- 新概念英语(1-49)At the butcher's
新概念英语(1-49)At the butcher's What does Mr. Bird like? A:Do you want any meat today, Mrs. Bird? B:Yes, ...