[CF707D]Persistent Bookcase_主席树_bitset
Persistent Bookcase
题目链接:http://codeforces.com/contest/707/problem/D
注释:略。
题解:
发现虽然$q\le 10^5$但是网格是$1000\times 1000$的,而且每次操作只会操作一行。
故此我们考虑按照行来搞。
想到每次暴力重新建一行,但是空间开不下,我们用$bitset$即可。
但是我们又面临一个问题,即:回到某一个时刻。
这个很难弄,最简单的支持可持久化的数据结构是主席树,所以我们对行建主席树。
每次修改操作我们都新开一个$bitset$,主席树的第$i$个叶子表示的是第$i$行对应哪一个$bitset$。
时间复杂度为$O(\frac{np}{32} +plogn)$。
代码:
#include <bits/stdc++.h>
#define setIO(s) freopen(s".in", "r", stdin), freopen(s".out", "w", stdout)
#define N 400010
using namespace std;
bitset <1010 > b[N], mdl;
char *p1, *p2, buf[100000];
#define nc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? EOF : *p1 ++ )
int rd() {
int x = 0, f = 1;
char c = nc();
while (c < 48) {
if (c == '-')
f = -1;
c = nc();
}
while (c > 47) {
x = (((x << 2) + x) << 1) + (c ^ 48), c = nc();
}
return x * f;
}
int cnt = 0, rt[N];
struct Node {
int v;
int ls, rs;
}a[N * 30];
void update(int x, int val, int l, int r, int &p, int pre) {
p = ++cnt;
a[p] = a[pre];
if (l == r) {
a[p].v = val;
return;
}
int mid = (l + r) >> 1;
if (x <= mid) {
update(x, val, l, mid, a[p].ls, a[pre].ls);
}
else {
update(x, val, mid + 1, r, a[p].rs, a[pre].rs);
}
}
int query(int x, int l, int r, int p) {
if (l == r) {
return a[p].v;
}
int mid = (l + r) >> 1;
if (x <= mid) {
return query(x, l, mid, a[p].ls);
}
else {
return query(x, mid + 1, r, a[p].rs);
}
}
int ans[N];
void build(int l, int r, int &p) {
if (!p) {
p = ++cnt;
}
if (l == r) {
a[p].v = l;
return;
}
int mid = (l + r) >> 1;
build(l, mid, a[p].ls), build(mid + 1, r, a[p].rs);
}
int main() {
// setIO("now");
int n = rd(), m = rd(), q = rd();
for (int i = 1; i <= m; i ++ ) {
// 1 << (i - 1)
mdl.set(i);
}
build(1, n, rt[0]);
int tmp = n;
for (int i = 1; i <= q; i ++ ) {
int opt = rd();
ans[i] = ans[i - 1];
if (opt == 1) {
int x = rd(), y = rd();
int z = query(x, 1, n, rt[i - 1]);
b[ ++ tmp] = b[z];
b[tmp].set(y);
ans[i] += b[tmp].count() - b[z].count();
update(x, tmp, 1, n, rt[i], rt[i - 1]);
}
else if (opt == 2) {
int x = rd(), y = rd();
int z = query(x, 1, n, rt[i - 1]);
b[ ++ tmp] = b[z];
b[tmp].reset(y);
ans[i] += b[tmp].count() - b[z].count();
update(x, tmp, 1, n, rt[i], rt[i - 1]);
}
else if (opt == 3) {
int x = rd();
int z = query(x, 1, n, rt[i - 1]);
b[ ++ tmp] = b[z];
b[tmp].flip();
b[tmp] = b[tmp] & mdl;
ans[i] += b[tmp].count() - b[z].count();
update(x, tmp, 1, n, rt[i], rt[i - 1]);
}
else {
int x = rd();
ans[i] = ans[x];
rt[i] = rt[x];
}
printf("%d\n", ans[i]);
}
return 0;
}
[CF707D]Persistent Bookcase_主席树_bitset的更多相关文章
- POJ 2104 K-th Number(主席树——附讲解)
Description You are working for Macrohard company in data structures department. After failing your ...
- BZOJ.3489.A simple rmq problem(主席树 Heap)
题目链接 当时没用markdown写,可能看起来比较难受...可以复制到别的地方看比如DevC++. \(Description\) 给定一个长为n的序列,多次询问[l,r]中最大的只出现一次的数.强 ...
- HDU2665Kth number (主席树+离散)
Give you a sequence and ask you the kth big number of a inteval. InputThe first line is the number o ...
- 静态区间第k大(主席树)
POJ 2104为例(主席树入门题) 思想: 可持久化线段树,也叫作函数式线段树,也叫主席树(高大上). 可持久化数据结构(Persistent data structure):利用函数式编程的思想使 ...
- CF707D Persistent Bookcase
CF707D Persistent Bookcase 洛谷评测传送门 题目描述 Recently in school Alina has learned what are the persistent ...
- bzoj3207--Hash+主席树
题目大意: 给定一个n个数的序列和m个询问(n,m<=100000)和k,每个询问包含k+2个数字:l,r,b[1],b[2]...b[k],要求输出b[1]~b[k]在[l,r]中是否出现. ...
- bzoj1901--树状数组套主席树
树状数组套主席树模板题... 题目大意: 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[ ...
- BZOJ 3626: [LNOI2014]LCA [树链剖分 离线|主席树]
3626: [LNOI2014]LCA Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2050 Solved: 817[Submit][Status ...
- BZOJ 1146: [CTSC2008]网络管理Network [树上带修改主席树]
1146: [CTSC2008]网络管理Network Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 3522 Solved: 1041[Submi ...
随机推荐
- C语言学习笔记7-字符串
本系列文章由jadeshu编写,转载请注明出处.http://blog.csdn.net/jadeshu/article/details/50752405 作者:jadeshu 邮箱: jades ...
- Python流程控制和缩进
我们语文学写作文,有如果- -,那么- -的句式,同样Python也有这样的句式: #如何这个条件成立了,那就执行下面这个语句 if 条件: 内容1 内容2 else: 内容3 几点说明:
- Liunx之django项目部署
一.python web 项目部署 python django默认启动python3 manage.py runserver 0.0.0.0:8000这种方式调用wsgiref单机模块,性能较低,生产 ...
- HDU 1074 Doing Homework ——(状态压缩DP)
考虑到n只有15,那么状压DP即可. 题目要求说输出字典序最小的答案的顺序,又考虑到题目给出的字符串本身字典序是递增的,那么枚举i的时候倒着来即可.因为在同样完成的情况下,后选字典序大的,小的字典序就 ...
- @Transactional注解详细用法
概述 事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性.Spring Framework对事务管理提供了一致的抽象,其特点如下: 为不同的事务API提供一致的编程模型, ...
- Python 函数lambda(), filter(), map(), reduce()
1 filter filter(function, sequence):对sequence中的item依次执行function(item),将执行结果为True的item组成一个List/String ...
- CISCO实验记录八:ACL访问控制
1.使用ACL实现免ping #access-list 100 deny icmp 192.168.0.1 0.0.0.0 192.168.1.2 0.0.0.0 #access-list 100 p ...
- Vue 目录
什么是 vue-cli 通过 vue-cli 建立出来的 vue
- Flutter实现TabBarView切换页面时每个页面只initState一次
在 TabBarView 组件中切换页面时,子页面每次均会重新 initState 一次,导致每次都切换页面均会重绘,如下图 如果需要只在第一次进页面 initState 一次,后面再进入 ...
- 通过generate解析SQL日志生成xml进行SQL回放
查看Oracle redo日志来分析SQL执行记录 1)设置Oracle数据字典导出路径参数(可选) shutdown immediatealter system set UTL_FILE_DIR=' ...