BZOJ2568 [国家集训队2012]比特集合
Description
INS M : 将元素 M 插入到集合S中;
DEL M : 将集合S中所有等于 M 的元素删除;
ADD M : 将集合S中的所有元素都增加数值M ;
QBIT k : 查询集合中有多少个元素满足其二进制的第 k位为 1 。
初始时,集合S为空集。请实现一个比特集合,并对于所有的QBIT操作输出相应的答案。
Input
接下来N行,每行为一个操作,格式见问题描述。
Output
Sample Input
INS 1
QBIT 0
ADD 1
QBIT 0
QBIT 1
DEL 2
INS 1
QBIT 1
Sample Output
0
1
0
HINT
数据规模和约定
时间限制2s。
对于30%的数据,1 ≤ N ≤ 10000。
对于100%的数据,1 ≤ N ≤ 500000;QBIT操作中的k满足, 0 ≤ k < 16。INS/DEL操作中,满足0 ≤ M ≤ 10^9;ADD操作中, 满足0 ≤ M ≤ 1000。
注意
注意集合S可以包含多个重复元素。
题解
首先我们可以发现整体加只是要维护一个标记cnt表示当前加了多少,那么add x->add (x - cnt), del x -> del (x - cnt), qbit k ->查询加cnt之后第k位为1的数的个数<=>查询后k位在$[2^k - cnt, 2^{k + 1} - 1 - cnt]$范围内的数。
令$c[i][j]$表示后$i$位小于等于$j$的数的个数,用树状数组维护,那么答案就是$num - c[i][2^k-1]$(没有计$cnt$的影响)。
附代码:
#include <algorithm>
#include <cstdio>
#include <set>
typedef long long LL;
const int mod = 1000000009;
inline int lowbit(int x) { return x & -x; }
const int N = 1 << 16;
int s[16][N];
void add(int a, int k, int x) {
for (++k; k <= N; k += lowbit(k))
s[a][k] += x;
}
int query(int a, int k) {
int ans = 0;
for (++k; k; k -= lowbit(k)) ans += s[a][k];
return ans;
}
std::multiset<int> S;
int main() {
int m, x, cnt = 0, num = 0;
scanf("%d", &m);
char s[10];
while (m--) {
scanf("%s%d", s, &x);
if (*s == 'I') {
++num;
S.insert(x -= cnt);
for (int i = 0; i < 16; ++i) add(i, ((1 << (i + 1)) - 1) & x, 1);
} else if (*s == 'D') {
int l = S.count(x -= cnt);
num -= l;
S.erase(x);
for (int i = 0; i < 16; ++i) add(i, ((1 << (i + 1)) - 1) & x, -l);
} else if (*s == 'A') {
cnt += x;
} else {
int r = ((1 << x) - cnt - 1) & ((1 << (x + 1)) - 1), l = (-cnt) & ((1 << (x + 1)) - 1);
if (r >= l)
printf("%d\n", num - query(x, r) + query(x, l - 1));
else
printf("%d\n", query(x, l - 1) - query(x, r));
}
}
return 0;
}
BZOJ2568 [国家集训队2012]比特集合的更多相关文章
- [国家集训队2012]middle
http://cogs.pro:8080/cogs/problem/problem.php?pid=1763 二分答案x 把区间内>=x的数设为1,<x的数设为-1 左端点在[a,b]之间 ...
- [国家集训队2012]JZPFAR
[国家集训队2012]JZPFAR 题目 平面上有n个点.现在有m次询问,每次给定一个点(px, py)和一个整数k,输出n个点中离(px, py)的距离第k大的点的标号.如果有两个(或多个)点距离( ...
- [国家集训队2012]tree(陈立杰)
[国家集训队2012]tree(陈立杰) 题目 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树.题目保证有解. INPUT 第一行V,E,need分别表示 ...
- 数据结构(动态树):[国家集训队2012]tree(伍一鸣)
[问题描述] 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2:将树中原 ...
- 【国家集训队2012】tree(伍一鸣)
Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 ...
- [COGS 1799][国家集训队2012]tree(伍一鸣)
Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一: + u v c:将u到v的路径上的点的权值都加上自然数c: - u1 v1 u2 v2 ...
- cogs1799 [国家集训队2012]tree(伍一鸣)
LCT裸题 注意打标记之间的影响就是了 这个膜数不会爆unsigned int #include<cstdio> #include<cstdlib> #include<a ...
- [国家集训队2012]middle(陈立杰)
我是萌萌的传送门 我是另一个萌萌的传送门 脑残错误毁一下午…… 其实题解早就烂大街了,然而很久之前我只知道是二分答案+主席树却想不出来这俩玩意儿怎么一块儿用的……今天又翻了几篇题解才恍然大悟,是把权值 ...
- [国家集训队2012]tree(陈立杰) 题解(二分+最小生成树)
tree 时间限制: 3 Sec 内存限制: 512 MB 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. 输入 第一行V, ...
随机推荐
- C++多线程编程二
1. 死锁与解锁: #include <iostream> #include <thread> #include <mutex> using namespace s ...
- 安装php7
./configure --prefix=/usr/local/php7.1.5 --with-curl --with-iconv-dir --with-mysqli --with-openssl ...
- URL中 # (hash)的含义
url中#(hash)的含义 hash 属性是一个可读可写的字符串,该字符串是 URL 的锚部分(从 # 号开始的部分) 1."#"代表网页中的一个位置.其右面的字符,就是该位置的 ...
- C#-WebForm-ajax状态保持
cookies: ashx端赋值: context.Response.Cookies["Username"].Value = ""; 后台端加载: Respon ...
- jenkins+appium android app自动化测试
jenkins安装 pytest+jenkins安装+allure报告 新建任务 其他默认,保存 立即构建 test_login.py from src.pages import login_page ...
- HAL库定时器
1.在cubmx中设置时钟源,设置对应的定时器,预分频系数,计数模式,是否自动重装载,中断使能,中断优先级 2.HAL_TIM_Base_Start_IT(&htim2);开启定时器中断 3. ...
- L: Long Long Ago---二分
L: Long Long Ago 时间限制: 1 s 内存限制: 128 MB 题目描述 今天SHIELD捕获到一段从敌方基地发出的信息里面包含一串被经过某种算法加密过的的序列 ...
- 设置获取用户登录信息的Seeion类
/** * * 保存用户上下文信息 * 还可以获取session * */ public class UserContext { public static final String USER_IN_ ...
- Spark Launcher
- 部署rails遇到问题
underfined method for has_attched_file when installing paperclip 解决 create the file paperclip.rb ins ...