Description

题库链接

P 博士将他的计算任务抽象为对一个整数的操作。

具体来说,有一个整数 \(x\) ,一开始为 \(0\) 。

接下来有 \(n\) 个操作,每个操作都是以下两种类型中的一种:

  • 1 a b :将 \(x\) 加上整数 \(a\cdot 2^b\) ,其中 \(a\) 为一个整数, \(b\) 为一个非负整数
  • 2 k :询问 \(x\) 在用二进制表示时,位权为 \(2^k\) 的位的值(即这一位上的 \(1\) 代表 \(2^k\) )

保证在任何时候, \(x\geqslant 0\) 。

\(1\leq n\leq 10^6,|a| \leq 10^9,0 \leq b, k \leq 30n\)

Solution

考虑稍微暴力一点的做法,我们开两个数组来模拟进位(一个是 \(a > 0\) ,另一个 \(a < 0\) )。

然后对于询问,我们假设小于 \(k\) 位的部分 \(a>0\) 的是 \(s_1\) , \(a<0\) 的是 \(s_2\) 。

讨论所有情况,我们可以得出结论:

  • 若 \(s_1\geq s2\) ,输出答案为 \([x\oplus y]\) ,其中 \(x\) 是 \(a>0\) 的第 \(k\) 位的值, \(y\) 是 \(a<0\) 的第 \(k\) 位的值。
  • 若 \(s_1< s2\) ,输出答案为 \([x=y]\) 。

这样总复杂度是 \(O(30n\log(30n))\) 的。

考虑优化。

直接拿 \(\text{zkw线段树}\) 卡过去啦!

Code

#include <bits/stdc++.h>
using namespace std;
const int M = 1000000*30+300;
void gi(int &x) {
char ch = getchar(); x = 0; int flag = 0;
for (; ch < '0' || ch > '9'; ch = getchar()) flag |= (ch == '-');
for (; ch >= '0' && ch <= '9'; ch = getchar()) x = (x<<1)+(x<<3)+ch-48;
if (flag) x = -x;
} int s1[M], s2[M], tr[(1<<26)+5];
int n, N, rbsc, opt, a, b, lst[32], bin[32], tot; void modify(int *s, int a, int b) {
tot = 0;
for (int i = 30; i >= 0 && a; i--)
if (bin[i]&a) lst[++tot] = i, a -= bin[i];
int r = lst[1]+b, l = lst[tot]+b;
for (int i = 1; i <= tot; i++) {
int loc = lst[i]+b;
while (s[loc]) s[loc++] = 0;
r = max(r, loc), s[loc] = 1;
}
for (int i = l; i <= r; i++) tr[N+i] = (s1[i]^s2[i]);
for (l = (l+N)>>1, r = (r+N)>>1; l; l >>= 1, r >>= 1)
for (int j = l; j <= r; j++) tr[j] = tr[j<<1]|tr[j<<1|1];
}
int query(int a) {
for (a += N; a; a >>= 1)
if (a&1&tr[a^1]) {
for (a ^= 1; a < N; a = a<<1|tr[a<<1|1]);
return a-N;
}
return -1;
}
void work() {
gi(n); gi(rbsc), gi(rbsc), gi(rbsc);
for (N = 1; N <= n*30; N <<= 1);
bin[0] = 1; for (int i = 1; i <= 30; i++) bin[i] = (bin[i-1]<<1);
while (n--) {
gi(opt);
if (opt == 1) {
gi(a), gi(b);
if (a < 0) modify(s2, -a, b);
else modify(s1, a, b);
}else {
gi(a); int now = query(a);
if (now == -1 || s1[now] > s2[now]) putchar('0'+(s1[a]^s2[a]));
else putchar('0'+(s1[a] == s2[a]));
putchar('\n');
}
}
}
int main() {work(); return 0; }

[NOI 2017]整数的更多相关文章

  1. NOI 2017 整数(线段树)

    题意 https://loj.ac/problem/2302 思路 拆分成每个二进制位的加减来考虑,维护那个整数的二进制位.不难发现,进位就是找右边第一个 \(0\) 的位置,并将其赋值为 \(1\) ...

  2. NOI 2017滚粗退役记

    NOI 2017 游记 又到了OIer退役了的季节 Day -1 今天是报到日. 中午11点多的动车.动车上和dick32165401和runzhe2000谈笑风生.顺便用dick32165401的流 ...

  3. 【NOI】2017 整数(BZOJ 4942,LOJ2302) 压位+线段树

    [题目]#2302. 「NOI2017」整数 [题意]有一个整数x,一开始为0.n次操作,加上a*2^b,或询问2^k位是0或1.\(n \leq 10^6,|a| \leq 10^9,0 \leq ...

  4. NOI 2017 Day1 题解

    被虐爆了... T1 整数 题目传送门 Description 有一个整数 \(x\),有 \(n\) 此操作,每次操作为以下两种情况: 给出 \(a,b\),将 \(x\) 加上 \(a\times ...

  5. [NOI 2017]蔬菜

    Description 题库链接 小 N 是蔬菜仓库的管理员,负责设计蔬菜的销售方案. 在蔬菜仓库中,共存放有 \(n\) 种蔬菜,小 N 需要根据不同蔬菜的特性,综合考虑各方面因素,设计合理的销售方 ...

  6. [NOI 2017]游戏

    Description 题库链接 小 L 计划进行 \(n\) 场游戏,每场游戏使用一张地图,小 L 会选择一辆车在该地图上完成游戏. 小 L 的赛车有三辆,分别用大写字母 A.B.C 表示.地图一共 ...

  7. [NOI 2017]蚯蚓排队

    Description 题库链接 蚯蚓幼儿园有 \(n\) 只蚯蚓.幼儿园园长神刀手为了管理方便,时常让这些蚯蚓们列队表演. 所有蚯蚓用从 \(1\) 到 \(n\) 的连续正整数编号.每只蚯蚓的长度 ...

  8. (转)2-SAT小结

    2-sat小结 原文作者:老K 原文传送门 2-sat是什么 一类问题是这样的: (两个符号的意思 \(\lor \ or,\land \ and\)) 有n个布尔变量,现在对它们做出限制,比如\(a ...

  9. [转帖]亚马逊发布自主64核心ARM处理器:单核性能远超铂金至强

    亚马逊发布自主64核心ARM处理器:单核性能远超铂金至强 https://news.mydrivers.com/1/660/660383.htm 不知道真假 看样子比华为的鲲鹏920 要牛B . 亚马 ...

随机推荐

  1. springmvc为什么是线程不安全的

    1.因为springmvc默认是单例的,所以会有线程安全的问题,如果存在全局变量,因为全局变量是存在方法区的,而局部变量是放在栈中的,方法区是所有线程公用的,而每个线程都有属于自己的栈.所以如果使用单 ...

  2. 第一个VS2015 Xaramin Android项目

    20170323新增:VS环境配置 打开VS,菜单栏选工具(Tools) 选项\ 一般有2个地方需要修改 1 2 新建第一个项目,什么都没有修改的情况下(已经配置好环境变量)直接运行,会发现如下错误: ...

  3. [C#.net]ListBox对Item进行重绘,设置背景色和前景色

    别的不多说了,上代码,直接看 首先设置这行,或者属性窗口设置,这样才可以启动手动绘制,参数有三个 Normal: 自动绘制 OwnerDrawFixed:手动绘制,但间距相同 OwnerDrawVar ...

  4. 用scp这个命令来通过ssh传输文件

    小结: 1. upload files 到 ssh 服务器 localhost $ scp localfile root@172.20.34.**:~/remotepath 2. 从 ssh 服务器d ...

  5. 下单快发货慢:一个 JOIN SQL 引起 SqlClient 读取数据慢的奇特问题

    最近遇到一个非常奇特的问题,在一个 ASP.NET Core 项目中从 SQL Server 2008 R2 中查询获取 100 条记录竟然耗时 10 多秒,如果是查询本身慢,那到不是什么奇特的问题. ...

  6. Media Queries 媒体查询常见设备断点

    按需调整断点 一.谷歌后摘抄的一部分媒体查询 /*#region SmartPhones */ /* SmartPhones */@media only screen and (min-device- ...

  7. liunx----配置搜狗输入法

    话不多说直接看步骤 * 系统版本: ubuntu 18.04.1 // 查看命令为: # cat /etc/issue 1. 先查看当前系统是否存在 fcitx 框架: # dpkg -l | gre ...

  8. [CocoaPods]使用Trunk进行设置

    CocoaPods Trunk CocoaPods Trunk是一种身份验证和CocoaPods API服务.要将新的或更新的库发布到CocoaPods以进行公开发布,您需要在Trunk中注册并在当前 ...

  9. 彻底理解Java中的基本数据类型转换(自动、强制、提升)

    说基本数据类型转换之前,先了解下 Java 中的 8 种基本数据类型,以及它们的占内存的容量大小和表示的范围,如下图所示. 重新温故了下原始数据类型,现在来解释下它们之间的转换关系. 自动类型转换 自 ...

  10. Ehcache3开发入门简介

    在高并发应用中缓存就是核心机制.最近在研究Ehcache,发现这是一个更加灵活易用的缓存框架(相对于Redis.Memcache),Ehcache更加小巧轻便.而且都有持久化机制,不用担心JVM和服务 ...