4942: [Noi2017]整数


Time Limit: 50 Sec  Memory Limit: 512 MB
Submit: 363  Solved: 237
[Submit][Status][Discuss]

Description


http://www.lydsy.com/JudgeOnline/upload/Noi2017D1.pdf

Input

Output

Sample Input

Sample Output

HINT

分析:


 如果维护一个3*10^7次方的数组表示这个数,只有加法是很好办的,但是有减法的话就不好办了。所以维护两个3*10^7次方的数组,表示加法每一位是否是1减法每一位是否是1.
 查询的时候高位是不关乎当前位的事,只关心当前位的加减法和低位中最高位加减法数组不同的两个位置,加减法不同的位置可以用线段树维护。

AC代码:


# include <iostream>
# include <cstdio>
using namespace std;
const int N = << ;
const int mx = << ;
bool Inc[N],Dec[N],t[N << ];
int l,r,n;
int read()
{
int x = ,f = ;char i = getchar();
while(!isdigit(i))f = i == '-' ? - : f,i = getchar();
while(isdigit(i))x = x * + i - '',i = getchar();
return x * f;
}
void add(bool *c,int x)
{
for(;c[x];c[x++] = );
c[x] = ;
if(x > r)r = x;
}
int find(int x)
{
for(x += mx;x;x >>= )if(x & & t[x ^ ])
{
for(x ^= ;x < mx;x = x << ^ t[x << | ]);
return x - mx;
}
return -;
}
int main()
{
int tp,x,y;n = read();read();read();read();
while(n--)
{
tp = read();
if(tp & )
{
x = read();y = read();
if(!x)continue;
l = r = y;tp = x > ? : ;x = x > ? x : -x;
if(tp){for(int i = ;i < ;i++)if(x >> i & )add(Inc,y + i);}
else {for(int i = ;i < ;i++)if(x >> i & )add(Dec,y + i);}
for(int i = l;i <= r;i++)t[i + mx] = Inc[i] ^ Dec[i];
for(l = (l + mx) >> ,r = (r + mx) >> ;l;l >>= ,r >>= )
for(int i = l;i <= r;i++)t[i] = t[i << ] | t[i << | ];
}
else
{
x = read();y = find(x);
printf("%d\n",t[x + mx] ^ (~y && Inc[y] < Dec[y]) ? : );
}
}
}

[Bzoj4942][Noi2017]整数(线段树)的更多相关文章

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

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

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

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

  3. BZOJ4942 NOI2017整数(线段树)

    首先把每32位压成一个unsigned int(当然只要压起来能过就行).如果不考虑进/退位的话,每次只要将加/减上去的数拆成两部分直接单点修改就好了.那么考虑如何维护进/退位.可以发现进位的过程其实 ...

  4. 2018.10.30 bzoj4942: [Noi2017]整数(线段树压位)

    传送门 直接把修改的数拆成logloglog个二进制位一个一个修改是会TLETLETLE的. 因此我们把303030个二进制位压成一位储存在线段树里面. 然后维护区间中最靠左二进制位不为0/1的下标. ...

  5. UOJ #314. 【NOI2017】整数 | 线段树 压位

    题目链接 UOJ 134 题解 可爱的电音之王松松松出的题--好妙啊. 首先想一个朴素的做法! 把当前的整数的二进制当作01序列用线段树维护一下(序列的第i位就是整数中位权为\(2^k\)的那一位). ...

  6. noi2017 T1 整数 ——线段树

    loj.ac上有  题目传送门 不过我还是把题目搬过来吧 整数(integer)[题目背景]在人类智慧的山巅,有着一台字长为 1048576 位的超级计算机,著名理论计算机科 学家 P 博士正用它进行 ...

  7. BZOJ4946[Noi2017]蔬菜——线段树+堆+模拟费用流

    题目链接: [Noi2017]蔬菜 题目大意:有$n$种蔬菜,每种蔬菜有$c_{i}$个,每种蔬菜每天有$x_{i}$个单位会坏掉(准确来说每天每种蔬菜坏掉的量是$x_{i}-$当天这种蔬菜卖出量), ...

  8. 【noi2017】 整数 线段树or模拟

    ORZYYB 题目大意:你需要维护一个有$3\times 10^7$个二进制位的数,有一种修改方式和一种询问方式 对这个数加上$a\times2^b$,其中$|a|≤10^9$,$b≤3\times ...

  9. [BZOJ4942] [NOI2017]整数

    题目背景 在人类智慧的山巅,有着一台字长为1048576位(此数字与解题无关)的超级计算机,著名理论计算机科 学家P博士正用它进行各种研究.不幸的是,这天台风切断了电力系统,超级计算机 无法工作,而 ...

随机推荐

  1. c++IDE

    暂时使用Code::Blocks 16.01. 因为之前没有c++编译器,所以去官网选择安装codeblocks-16.01mingw-setup.exe 然后settings>Compiler ...

  2. Hive学习笔记(四)-- hive的桶表

    桶表抽样查询 查看hdfs上对应的文件内容 一个两个桶,第一个桶和第三个桶的数据 task = 4 4 / 2 = 2,一共是两个桶 第1个桶,第1+2个桶

  3. dataTable组件使用

    dataTable组件使用:引入JS $("#id").DataTable({ scrollY:450,    //开始滚动高度 lengthChange:false ,   // ...

  4. Android 标题栏(2)

    本文来自网易云社区 作者:孙圣翔 添加ActionProvider 1.在menu菜单中添加app:actionProviderClass属性: <item     android:id=&qu ...

  5. Python 协程、IO模型

    1.协程(单线程实现并发)2.I/0模型 2.1阻塞I/O 2.2非阻塞I/O 知识点一:协程 协程的目的:是想要在单线程下实现并发(并发看起来是同时运行的) 并发=多个任务间切换+保存状态(正常情况 ...

  6. Oracle PL/SQL 语言(Procedural Language/SQL)

    Oracle PL/SQL 语言(Procedural Language/SQL)是结合了结构化查询与 Oracle 自身过程控制为一体的强大语言,PL/SQL 不但支持更多的数据类型,拥有自身的变量 ...

  7. API生命周期第三阶段:API实施模式,以及结合swagger和项目现状的最佳模式

    这篇博客,主要是宏观介绍一下开发模式,尤其是针对于目前公司前后分离的项目! 一.API实施模式概述 API实施模式,主要是三个,其中API-First又是作为一种指导思想的一种,所以,简单来说事实实施 ...

  8. 九度oj 题目1391:顺时针打印矩阵

    题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2 ...

  9. ThinkPHP5杂技(二)

    不要使用数据库查询嵌套 if (!$listA = Db::name('coin') ->field('id,symbol') ->where('id', 'IN', logic('All ...

  10. Stack&Vector源码分析 jdk1.6

    参照:http://www.cnblogs.com/tstd/p/5104099.html Stack(Fitst In Last Out) 1.定义 public class Stack<E& ...