【noi2017】 整数 线段树or模拟
ORZYYB
题目大意:你需要维护一个有$3\times 10^7$个二进制位的数,有一种修改方式和一种询问方式
对这个数加上$a\times2^b$,其中$|a|≤10^9$,$b≤3\times 10^7$,保证需要维护的这个数始终非负
询问这个数第k个二进制位的值
总共有$10^6$次询问/修改操作
我们不难发现,如果只有加法操作的话,对任意一个位执行加法操作,均摊进位次数是1。
证明是显然的(我貌似之前在MC里面用红石电路模拟过二进制进位过程。。。。)
也就是说暴力加暴力进位的复杂度是正确的。
但是这里有a并不保证非负,这样一来通过精心(大雾)的构造方式,可以让你疯狂进位/退位,所以并不能单纯暴力模拟。
我们考虑对加法部分和减法部分分开维护(设A为加法的部分,B为减法的部分),这样的进位复杂度显然就是对的。
考虑到$A≥B$,那么显然有$\frac{A}{2^k}≥\frac{B}{2^k}$。
对于每次查询操作,我们分别找出A的第k位和B的第k位
现在对答案会产生影响的显然是A的末k-1位和B的末k-1位相减后,A的第k位是否需要退位。
我们考虑开一个set,若A的第i位和B的第i位不同,那么我们就把i丢入set中。
我们考虑在set中找到满足<k的i,直接判断A的第i位和B的第i位的大小关系,就可以判出是否会产生退位。
set的维护在对大数做修改的时候去更新。
考虑到这个数非常大,直接维护会超时,我们不妨做一波压位,然后再来维护,这样就跑得快很多了。
注意!对于一个32位的数,左移32位的操作会直接被忽略。
当然之前还有一些比较菜的想法,维护整个数的差分序列,若差分序列某个位置不为0就丢入set中,然后也来压位一波,不过代码估计长很多。
时间复杂度:$O(n\ log\ n)$
#include<bits/stdc++.h>
#define M 500005
#define S 64
#define L unsigned long long
using namespace std; int n,t1,t2,t3;
L a[M]={},b[M]={},P=-;
set<int> s; void upd(int x){
if(a[x]!=b[x]) s.insert(x);
else{
if(s.find(x)!=s.end()) s.erase(x);
}
} int main(){
scanf("%d%d%d%d",&n,&t1,&t2,&t3);
while(n--){
int op,B; scanf("%d",&op); L A;
int aa;
if(op==){
scanf("%d%d",&aa,&B);
if(aa>){
A=aa;
int x=B/S,y=B%S;
L s1=(A<<y)&P,s2=y?(A>>(S-y)):;
a[x]=a[x]+s1; upd(x);
if(a[x]<s1) s2++;
while(s2){
x++;
a[x]=a[x]+s2; upd(x);
s2=(a[x]<s2);
}
}else{
A=-aa;
int x=B/S,y=B%S;
L s1=(A<<y)&P,s2=y?(A>>(S-y)):;
b[x]=b[x]+s1; upd(x);
if(b[x]<s1) s2++;
while(s2){
x++;
b[x]=b[x]+s2; upd(x);
s2=(b[x]<s2);
}
}
}else{
scanf("%d",&B);
int x=B/S,y=B%S;
int ans=(((a[x]>>y)^(b[x]>>y))&);
A=y?(a[x]<<(S-y)):;
L BB=y?(b[x]<<(S-y)):;
if(A<BB) ans^=;
if(A==BB){
set<int>::iterator it=s.lower_bound(x);
if(it!=s.begin()){
it--; x=*it;
if(a[x]<b[x]) ans^=;
}
}
printf("%d\n",ans);
}
}
}
【noi2017】 整数 线段树or模拟的更多相关文章
- [BZOJ4942][Noi2017]整数 线段树+压位
用线段树来模拟加减法过程,维护连续一段中是否全为0/1. 因为数字很大,我们60位压一位来处理. #include<iostream> #include<cstring> #i ...
- BZOJ4946[Noi2017]蔬菜——线段树+堆+模拟费用流
题目链接: [Noi2017]蔬菜 题目大意:有$n$种蔬菜,每种蔬菜有$c_{i}$个,每种蔬菜每天有$x_{i}$个单位会坏掉(准确来说每天每种蔬菜坏掉的量是$x_{i}-$当天这种蔬菜卖出量), ...
- 【BZOJ4942】[Noi2017]整数 线段树+DFS(卡过)
[BZOJ4942][Noi2017]整数 题目描述去uoj 题解:如果只有加法,那么直接暴力即可...(因为1的数量最多nlogn个) 先考虑加法,比较显然的做法就是将A二进制分解成log位,然后依 ...
- UOJ #314. 【NOI2017】整数 | 线段树 压位
题目链接 UOJ 134 题解 可爱的电音之王松松松出的题--好妙啊. 首先想一个朴素的做法! 把当前的整数的二进制当作01序列用线段树维护一下(序列的第i位就是整数中位权为\(2^k\)的那一位). ...
- noi2017 T1 整数 ——线段树
loj.ac上有 题目传送门 不过我还是把题目搬过来吧 整数(integer)[题目背景]在人类智慧的山巅,有着一台字长为 1048576 位的超级计算机,著名理论计算机科 学家 P 博士正用它进行 ...
- Vijos P1103 校门外的树【线段树,模拟】
校门外的树 描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……, ...
- 【BZOJ3252】攻略 DFS序+线段树(模拟费用流)
[BZOJ3252]攻略 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏. 今天他得到了一款新游戏<XX半岛> ...
- HDU 4942 Game on S♂play(线段树、模拟、扩栈)
比赛的时候想到这题的大概做法,但由于卡别的水题...就赛后做了... 题意:给一个二叉树,每个结点有一个w[i],有3种操作,0 x表示左旋x,1 x表示右旋x,3 x表示询问x结点的价值,其中,价值 ...
- CF 552(div 3) E Two Teams 线段树,模拟链表
题目链接:http://codeforces.com/contest/1154/problem/E 题意:两个人轮流取最大值与旁边k个数,问最后这所有的数分别被谁给取走了 分析:看这道题一点思路都没有 ...
随机推荐
- 在 FR 网络配置 OSPF
一.环境准备 1. 软件:GNS3 2. 路由:c7200 二.实验操作 实验要求: 1.掌握配置帧中继的基本方法. 2.掌握在路由器中模拟帧中继交换机的方法. 3.掌握 NBMA 网络中 OSPF ...
- HBase 与 MapReduce 集成
6. HBase 与 MapReduce 集成 6.1 官方 HBase 与 MapReduce 集成 查看 HBase 的 MapReduce 任务的执行:bin/hbase mapredcp; 环 ...
- [转帖]商用数据库之死:Oracle 面临困境
商用数据库之死:Oracle 面临困境 投递人 itwriter 发布于 2019-10-20 08:22 评论(1) 有238人阅读 原文链接 [收藏] « » https://news.cnblo ...
- ABP中的AutoMapper
在我们的业务中经常需要使用到类型之间的映射,特别是在和前端页面进行交互的时候,我们需要定义各种类型的Dto,并且需要需要这些Dto和数据库中的实体进行映射,对于有些大对象而言,需要赋值太多的属性,这样 ...
- 以php中的自增自自减运算符操作(整型,浮点型,字符串型,布尔型,空类型)数据
// 环境 // // php版本 // PHP 7.0.33-0+deb9u1 (cli) (built: Dec 7 2018 11:36:49) ( NTS ) // Copyright (c) ...
- RAP2 前后端开发利器搭建
RAP2 是一个api管理系统,前后端协作开发的利器. 在线体验地址http://rap2.taobao.org Web接口管理工具,开源免费,接口自动化,MOCK数据自动生成,自动化测试,企业级管理 ...
- 怎样理解window对象的几组位置大小属性
第一组: window.screenX 和 window.screenY, 只读, 返回浏览器窗口左上角与屏幕左上角的水平距离和垂直距离(单位像素); 第二组: window.innerHeight ...
- Spring Cloud Alibaba学习笔记(9) - RocketMQ安装与RocketMQ控制台
搭建RocketMQ 系统环境准备 64位操作系统,推荐使用Linux.Unix.MacOS 64位 JDK1.8+ Maven 3.2.x 适用于Broker服务器的4g +可用磁盘 下载与搭建 下 ...
- HTML 标签入门
HTML 简介 定义: 超文本标记语言(html)是标准通用标记语言下的一个应用,也是一种规范,一种标准 它通过标记符号来表示网页中的各个部分,网页文件本身是一种文本文件,通过在文本文件中添加标记符, ...
- 计算机等级考试【二级C语言程序设计】知识点整理
*免责声明:本文章中所收集或者引用到的内容的所有版权均为引用内容的原作者所有,本站仅作收集并整理,不承担任何法律责任! *题库收集来源于:[未来教育考试软件2017年版 - 计算机二级 - C语言程序 ...