\(\mathscr{Description}\)

  Link.

  初始有整数 \(x=0\), 给出 \(n\) 次操作, 每次操作为 \(x\gets x+a\cdot2^b\) 或询问 \(x\) 的第 \(k\) bit.

  \(n\le10^6\), \(|a|\le10^9\), \(b,k\le30n\). 保证时刻 \(x\ge0\).

\(\mathscr{Solution}\)

  注意到单纯的二进制加 bit 是均摊 \(\mathcal O(1)\) 的, 为了避免摊还分析的失效, 我们分开维护仅有 \(a>0\) 是的 \(x_+\) 和仅有 \(a<0\) 时的 \(x_-\).

  此时询问转变为求 \(x_+-x_-\) 的第 \(k\) bit. 通过 set 维护 \(x_+\) 和 \(x_-\) 的差异 bit, 判断后缀大小关系即可实现. 但这又带来一个问题: 修改的复杂度会带上一个 \(\log\), 如果再对 \(|a|\) 暴力拆 bit 就寄了. 所以还需要用 unsigned 之类的东西压位存储. 最终复杂度为 \(\mathcal O(n\log n)\) (\(a\) 拆为 unsigned 的数量为 \(\mathcal O(1)\)).

\(\mathcal{Code}\)

/* Clearink */

#include <set>
#include <cstdio> #define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i ) inline char fgc() {
static char buf[1 << 17], *p = buf, *q = buf;
return p == q && ( q = buf + fread( p = buf, 1, 1 << 17, stdin ), p == q )
? EOF : *p++;
} inline int rint() {
int x = 0, f = 1; char s = fgc();
for ( ; s < '0' || '9' < s; s = fgc() ) f = s == '-' ? -f : f;
for ( ; '0' <= s && s <= '9'; s = fgc() ) x = x * 10 + ( s ^ '0' );
return x * f;
} typedef unsigned long long ULL; const int MAXD = 468751, W = 6;
int q;
ULL dig[2][MAXD + 5];
std::set<int> dif; inline void add( const bool id, const int k ) {
int b = k >> W, p = k - ( b << W );
ULL tmp = dig[id][b];
if ( ( dig[id][b] += 1ull << p ) < tmp ) add( id, b + 1 << W );
if ( dig[id][b] == dig[id ^ 1][b] ) dif.erase( b );
else dif.insert( b );
} inline bool query( const int k ) {
int b = k >> W, p = k - ( b << W );
bool f = ( dig[0][b] >> p & 1 ) != ( dig[1][b] >> p & 1 );
ULL u0 = dig[0][b] & ( ( 1ull << p ) - 1ull );
ULL u1 = dig[1][b] & ( ( 1ull << p ) - 1ull );
if ( u0 != u1 ) return f ? u0 >= u1 : u0 < u1;
std::set<int>::iterator it( dif.lower_bound( b ) );
if ( it == dif.begin() ) return f;
--it;
return f ? dig[0][*it] >= dig[1][*it] : dig[0][*it] < dig[1][*it];
} int main() {
q = rint(), rint(), rint(), rint();
for ( int op, a, b; q--; ) {
op = rint(), a = rint();
if ( op == 1 ) {
b = rint();
bool f = a < 0;
if ( f ) a = -a;
for ( int i = 0; 1 << i <= a; ++i ) if ( a >> i & 1 ) {
add( f, b + i );
}
} else {
putchar( '0' ^ query( a ) ), putchar( '\n' );
}
}
return 0;
}

Solution -「NOI 2017」「洛谷 P3822」整数的更多相关文章

  1. [bzoj4942] [洛谷P3822] [NOI2017] 整数

    题目链接 https://www.luogu.org/problemnew/show/P3822 想法 这个啊,就是线段树哇 最初的想法是每位一个节点,然后进位.退位找这一位前面第一个0或第一个1,然 ...

  2. 「区间DP」「洛谷P1043」数字游戏

    「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...

  3. [CodePlus 2017 11月赛&洛谷P4058]木材 题解(二分答案)

    [CodePlus 2017 11月赛&洛谷P4058]木材 Description 有 n棵树,初始时每棵树的高度为 Hi ,第 i棵树每月都会长高 Ai.现在有个木料长度总量为 S的订单, ...

  4. Solution -「JSOI 2019」「洛谷 P5334」节日庆典

    \(\mathscr{Description}\)   Link.   给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的).   \(|S|\le3\time ...

  5. Solution -「洛谷 P4372」Out of Sorts P

    \(\mathcal{Description}\)   OurOJ & 洛谷 P4372(几乎一致)   设计一个排序算法,设现在对 \(\{a_n\}\) 中 \([l,r]\) 内的元素排 ...

  6. Solution -「POI 2010」「洛谷 P3511」MOS-Bridges

    \(\mathcal{Description}\)   Link.(洛谷上这翻译真的一言难尽呐.   给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 ...

  7. Solution -「APIO 2016」「洛谷 P3643」划艇

    \(\mathcal{Description}\)   Link & 双倍经验.   给定 \(n\) 个区间 \([a_i,b_i)\)(注意原题是闭区间,这里只为方便后文描述),求 \(\ ...

  8. 「洛谷 P1801」黑匣子

    好像很久没有更过博客了,因为博主这几周很忙.其实是在搞颓. 题意很难懂,所以就不重复了.其实是懒. 一眼看上去这是个 \(Splay\) 裸题,直接插入一个数,查询区间第 \(K\) 大,但是这样太不 ...

  9. 「洛谷4197」「BZOJ3545」peak【线段树合并】

    题目链接 [洛谷] [BZOJ]没有权限号嘤嘤嘤.题号:3545 题解 窝不会克鲁斯卡尔重构树怎么办??? 可以离线乱搞. 我们将所有的操作全都存下来. 为了解决小于等于\(x\)的操作,那么我们按照 ...

  10. 「洛谷3338」「ZJOI2014」力【FFT】

    题目链接 [BZOJ] [洛谷] 题解 首先我们需要对这个式子进行化简,否则对着这么大一坨东西只能暴力... \[F_i=\sum_{j<i} \frac{q_iq_j}{(i-j)^2}-\s ...

随机推荐

  1. vivo 轩辕文件系统:AI 计算平台存储性能优化实践

    在早期阶段,vivo AI 计算平台使用 GlusterFS 作为底层存储基座.随着数据规模的扩大和多种业务场景的接入,开始出现性能.维护等问题.为此,vivo 转而采用了自研的轩辕文件系统,该系统是 ...

  2. 使用BackgroundService创建Windows 服务

    使用管理员权限启动cmd.exe 安装服务 sc.exe create ".NET Joke Service" binpath="C:\Path\To\App.Windo ...

  3. Vmware Workstation的虚拟机如何通过宿主机的无线网卡和外部通信

    今天需要在我的笔记本w10电脑上安装一个linux虚拟机,苦于我的w10是家庭版,没有hyper-v功能,所以安装了 vmware的workstation的软件,然后创建了虚拟机,但是总是搞不定如何让 ...

  4. TypeError: add_triangle_mesh(): incompatible function arguments. The following argument types are supported: 问题终于解决了!!!!

    1 2024.10.12 14:52 Traceback (most recent call last): File "terrain_creation.py", line 119 ...

  5. NATAPP实现内网穿透简易教程

    NATAPP是什么 NATAPP是一个十分容易上手的内网穿透工具,可以把本机的ip和端口映射到公网,将本机暴露在公网中供他人访问. 这在进行一些回调接口的本地测试(如支付宝微信支付的回调接口)时十分好 ...

  6. Xshell终端连接服务器慢,问题解决方法

    Xshell连接慢的话,先在xshell中设置中点隧道然后把转发xshell的勾取消 /etc/ssh/sshd_config 里边修改第115行UseDNS把注释取消然后yes改为no 然后重启ss ...

  7. 基于YOLO实现滑块验证码破解

    申明:本案例中的思路和技术仅用于学习交流.请勿用于非法行为. 一.训练模型 详细训练步骤和导出模型参考 滑块验证码识别模型训练 二.模型试用 通过YoloDotNet运行模型,计算出滑块缺口位置后用R ...

  8. Mongodb4.4安装与使用

    MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种.MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能 最丰富,最像关系数 ...

  9. docker之基本命令(2)

    上一篇介绍了一下,docker使用的有些基础命令.这次再来深入的了解一下较为复杂的docker命令   管理指令 说明 docker  container 用于管理容器 docker image 用于 ...

  10. ThreeJs-04详解材质与纹理

    一.matcap材质 这个材质不会受到光照影响,但是如果图片本身有光就可以一直渲染这个图片本来的样子,用来将一个图片纹理渲染到物体上的材质 代码实现 加载模型后,开启纹理渲染,并把它的材质变为这个材质 ...