原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ314.html

题解

  如果只加不减,那么瞎势能分析一波可以知道暴力模拟的复杂度是对的。

  但是有减法怎么办???

  再搞一个类似的,维护减了多少。

  那么,询问一个数位的值的时候,我们只需要得到两部分值中这一位的值是多少,以及是否退位,就可以得到答案。

  显然关键是退不退位。

  退不退位看这一位之后的后缀部分哪一个大。

  这里我们需要这样做: 如果加法和减法两部分维护的值中,某一位都不是 0 ,那么就两边互相抵消,直到两边至少有一个是 0 。

  那么判断哪一个大就是看两部分中,当前位以后,第一个有值的位置是哪一个大。用两个set瞎搞就好了。

  我们维护的时候用 $2^{30}$ 进制,这样时间复杂度就可以接受了。

  时间复杂度 $O(n\log n)$ 。

代码

#include <bits/stdc++.h>
#define clr(x) memset(x,0,sizeof (x))
#define y1 __zzd001
using namespace std;
typedef long long LL;
LL read(){
LL x=0,f=0;
char ch=getchar();
while (!isdigit(ch))
f|=ch=='-',ch=getchar();
while (isdigit(ch))
x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return f?-x:x;
}
const int N=(1<<20)+5;
int n,t1,t2,t3,base=1<<30;
int v[2][N];
set <int> s[2];
void upd1(int a,int b){
if (!a)
return;
if (v[1][b]){
int d=min(v[1][b],a);
v[1][b]-=d,a-=d;
if (!v[1][b])
s[1].erase(b);
}
if (!a)
return;
if (!v[0][b])
s[0].insert(b);
v[0][b]+=a;
if (v[0][b]>=base){
if (!(v[0][b]-=base))
s[0].erase(b);
upd1(1,b+1);
}
}
void upd2(int a,int b){
if (!a)
return;
if (v[0][b]){
int d=min(v[0][b],a);
v[0][b]-=d,a-=d;
if (!v[0][b])
s[0].erase(b);
}
if (!a)
return;
if (!v[1][b])
s[1].insert(b);
v[1][b]+=a;
if (v[1][b]>=base){
if (!(v[1][b]-=base))
s[1].erase(b);
upd2(1,b+1);
}
}
int main(){
n=read(),t1=read(),t2=read(),t3=read();
clr(v);
s[0].clear(),s[1].clear();
s[0].insert(-1),s[1].insert(-1);
while (n--){
int type=read();
if (type==1){
int a=read(),b=read();
int c=b%30,d=b/30;
if (a>=0){
upd1((a<<c)&(base-1),d);
upd1(a>>(30-c),d+1);
}
else {
a=-a;
upd2((a<<c)&(base-1),d);
upd2(a>>(30-c),d+1);
}
}
else {
int k=read();
int a=(v[0][k/30]>>(k%30)&1)^(v[1][k/30]>>(k%30)&1);
int x=v[0][k/30]&((1<<(k%30))-1);
int y=v[1][k/30]&((1<<(k%30))-1);
if (x!=y){
if (x<y)
a^=1;
}
else if (*--s[0].lower_bound(k/30)<*--s[1].lower_bound(k/30))
a^=1;
printf("%d\n",a);
}
}
return 0;
}

  

UOJ#314. 【NOI2017】整数 其他的更多相关文章

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

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

  2. [NOI2017]整数

    [NOI2017]整数 题目大意: \(n(n\le10^6)\)次操作维护一个长度为\(30n\)的二进制整数\(x\),支持以下两种操作: 将这个整数加上\(a\cdot2^b(|a|\le10^ ...

  3. [Bzoj4942][Noi2017]整数(线段树)

    4942: [Noi2017]整数 Time Limit: 50 Sec  Memory Limit: 512 MBSubmit: 363  Solved: 237[Submit][Status][D ...

  4. NOI2017整数

    NOI2017 整数 题意: ​ 让你实现两个操作: 1 \(a\) \(b\):将\(x\)加上整数\(a \cdot 2 ^ b\),其中 \(a\)为一个整数,\(b\)为一个非负整数 2 \( ...

  5. 【BZOJ4942】[NOI2017]整数(分块)

    [BZOJ4942][NOI2017]整数(分块) 题面 BZOJ 洛谷 题解 暴力就是真正的暴力,直接手动模拟进位就好了. 此时复杂度是模拟的复杂度加上单次询问的\(O(1)\). 所以我们需要优化 ...

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

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

  7. BZOJ4942 & UOJ314:[NOI2017]整数——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4942 http://uoj.ac/problem/314 https://www.luogu.or ...

  8. BZOJ.4942.[NOI2017]整数(分块)

    BZOJ 洛谷 UOJ 可能是退役之前最后一个BZOJ rank1了? 参考这里. 如果没有减法,对一个二进制数暴力进位,均摊复杂度是\(O(1)\)的(要进\(O(n)\)次位就至少需要\(O(n) ...

  9. [Noi2017]整数 BZOJ4942

    分析: 30+暴力应该还是蛮水的,可以随便写写... 60+的就没那么容易了,但是应该挺裸的,往上架一颗线段树,查询连续1或0的长度,或者找到前缀中,第一个1或0,之后区间覆盖,单点查询,开bool, ...

随机推荐

  1. jQUERY中的属性获取

    jQuery获取Select选择的Text和Value:语法解释:1. $("#select_id").change(function(){//code...});   //为Se ...

  2. Codeforces 1082C Multi-Subject Competition(前缀+思维)

    题目链接:Multi-Subject Competition 题意:给定n名选手,每名选手都有唯一选择的科目si和对应的能力水平.并且给定科目数量为m.求选定若干个科目,并且每个科目参与选手数量相同的 ...

  3. 联想的笔记本有隐藏分区 导致无法安装win10 eufi启动 报错:windows无法更新计算机的启动配置。无法安装

    联想的笔记本都带着类似一键还原等的系统恢复软件,这些软件往往是将出厂设置备份在单 独的一个分区,此分区默认为隐藏,在 Windows 的磁盘管理中可以看到.打开磁盘管理器 的方法是右击计算机——管理, ...

  4. CF757E Bash Plays with Functions

    题解 q<=1e6,询问非常多.而n,r也很大,必须要预处理所有的答案,询问的时候,能比较快速地查询. 离线也是没有什么意义的,因为必须递推. 先翻译$f_0(n)$ $f_0(n)=\sum_ ...

  5. 快速定位XPATH

    本文主要介绍如何快速定位WEB端的xpath. 浏览器:Chrome.火狐浏览器 两种浏览器的定位方法都是一样:按F12键,可查看开发者工具 上图,开发者工具最左上角是定位按钮,点击此按钮,再点击浏览 ...

  6. 腾讯云服务器tomcat端口无法访问

    第一种情况: 如题:https://console.cloud.tencent.com/cvm/securitygroup 需要去这个地址设置安全组. 说实话,一句mmp不知当讲不当讲.使用说明这块太 ...

  7. 五十一、进程间通信——System V IPC 之进程信号量

    51.1 进程信号量 51.1.1 信号量 本质上就是共享资源的数目,用来控制对共享资源的访问 用于进程间的互斥和同步 每种共享资源对应一个信号量,为了便于大量共享资源的操作引入了信号量集,可对所有信 ...

  8. python3 asyncio-协程模块测试代码

    import time import asyncio #统计运行时间的装饰器 def run_time(func): def wrapperfunc(*argv, **kwargv): now = l ...

  9. 在window系统上安装redis服务-Invalid argument during startup: Failed to open the .conf

    当前redis版本: redis-cli -v redis-cli 3.0.503 网上给的命令(在redis所在文件夹下执行): redis-server –service-install redi ...

  10. 第六节,Python的科学计算包——Numpy

    1.基本类型(array) import numpy as np a=[1,2,3,4] b=np.array(a) #array([1,2,3.4]) type(b) #<type 'nump ...