D. Persistent Bookcase(Codeforces Round #368 (Div. 2))
2 seconds
512 megabytes
standard input
standard output
Recently in school Alina has learned what are the persistent data structures: they are data structures that always preserves the previous version of itself and access to it when it is modified.
After reaching home Alina decided to invent her own persistent data structure. Inventing didn't take long: there is a bookcase right behind her bed. Alina thinks that the bookcase is a good choice for a persistent data structure. Initially the bookcase is empty, thus there is no book at any position at any shelf.
The bookcase consists of n shelves, and each shelf has exactly m positions for books at it. Alina enumerates shelves by integers from 1to n and positions at shelves — from 1 to m. Initially the bookcase is empty, thus there is no book at any position at any shelf in it.
Alina wrote down q operations, which will be consecutively applied to the bookcase. Each of the operations has one of four types:
- 1 i j — Place a book at position j at shelf i if there is no book at it.
- 2 i j — Remove the book from position j at shelf i if there is a book at it.
- 3 i — Invert book placing at shelf i. This means that from every position at shelf i which has a book at it, the book should be removed, and at every position at shelf i which has not book at it, a book should be placed.
- 4 k — Return the books in the bookcase in a state they were after applying k-th operation. In particular, k = 0 means that the bookcase should be in initial state, thus every book in the bookcase should be removed from its position.
After applying each of operation Alina is interested in the number of books in the bookcase. Alina got 'A' in the school and had no problem finding this values. Will you do so?
The first line of the input contains three integers n, m and q (1 ≤ n, m ≤ 103, 1 ≤ q ≤ 105) — the bookcase dimensions and the number of operations respectively.
The next q lines describes operations in chronological order — i-th of them describes i-th operation in one of the four formats described in the statement.
It is guaranteed that shelf indices and position indices are correct, and in each of fourth-type operation the number k corresponds to some operation before it or equals to 0.
For each operation, print the number of books in the bookcase after applying it in a separate line. The answers should be printed in chronological order.
2 3 3
1 1 1
3 2
4 0
1
4
0
4 2 6
3 2
2 2 2
3 3
3 2
2 2 2
3 2
2
1
3
3
2
4
2 2 2
3 2
2 2 1
2
1

This image illustrates the second sample case.
思路:dfs+bitset;
每个状态都是由前面的状态而得到的,但当4操作的时候,这个时候这个状态就是k那个状态,所以本状态可以看成是有k状态得来,所以我们可以建图,确定当前状态的前一个状态
,然后dfs就行了,并且用bitset记录状态。
1 #include<stdio.h>
2 #include<algorithm>
3 #include<iostream>
4 #include<string.h>
5 #include<queue>
6 #include<set>
7 #include<bitset>
8 using namespace std;
9 typedef struct node
10 {
11 int val;
12 int x;
13 int y;
14 } ss;
15 ss ak[100005];
16 bitset<1005>bit[1005],c;
17 vector<int>vec[100005];
18 int ask[100005];
19 bool T[100005];
20 int all;
21 void ou(int s);
22 void dfs(int s);
23 void in(int s);
24 int main(void)
25 {
26 int i,j;
27 int n,m,k;
28 while(scanf("%d %d %d",&n,&m,&k)!=EOF)
29 {
30 all = 0;
31 memset(T,0,sizeof(T));
32 for(i = 1; i <= m ; i++)
33 {
34 bit[i].reset();
35 c.set(i);
36 }
37 for(i = 0; i < 10005; i++)
38 vec[i].clear();
39 for(i = 1; i <= k; i++)
40 {
41 scanf("%d",&ak[i].val);
42 if(ak[i].val<= 2)
43 {
44 scanf("%d %d",&ak[i].x,&ak[i].y);
45 vec[i-1].push_back(i);
46 }
47 else
48 {
49 scanf("%d",&ak[i].x);
50 if(ak[i].val == 3)
51 {
52 vec[i-1].push_back(i);
53 }
54 else vec[ak[i].x].push_back(i);
55 }
56 }
57 dfs(0);
58 for(i = 1; i <=k ; i++)
59 printf("%d\n",ask[i]);
60 }
61 return 0;
62 }
63 void dfs(int s)
64 {
65 int i,j;
66 for(i = 0; i < vec[s].size() ; i++)
67 {in(vec[s][i]);dfs(vec[s][i]);ou(vec[s][i]);}
68 }
69 void in(int s)
70 {
71 if(ak[s].val == 1)
72 {
73 if(!bit[ak[s].x][ak[s].y])
74 {
75 T[s] = true;
76 bit[ak[s].x].set(ak[s].y);
77 ask[s] = all+1;
78 all++;
79 }
80 else ask[s] = all;
81 }
82 else if(ak[s].val == 2)
83 {
84 if(bit[ak[s].x][ak[s].y])
85 {
86 T[s] = true;
87 bit[ak[s].x].reset(ak[s].y);
88 ask[s] = all-1;
89 all--;
90 }
91 else ask[s] = all;
92 }
93 else if(ak[s].val == 3)
94 {
95 all -=bit[ak[s].x].count();
96 bit[ak[s].x] ^= c;
97 all += bit[ak[s].x].count();
98 ask[s] = all;
99
100 }
101 else ask[s] = all;
102 }
103 void ou(int s)
104 {
105 if(ak[s].val == 1)
106 {
107 if(T[s])
108 {
109 all --;
110 bit[ak[s].x].reset(ak[s].y);
111 }
112 }
113 else if(ak[s].val == 2)
114 {
115 if(T[s])
116 {
117 all++;
118 bit[ak[s].x].set(ak[s].y);
119 }
120 }
121 else if(ak[s].val == 3)
122 {
123 all -=bit[ak[s].x].count();
124 bit[ak[s].x] ^= c;
125 all += bit[ak[s].x].count();
126 }
127 }
D. Persistent Bookcase(Codeforces Round #368 (Div. 2))的更多相关文章
- Codeforces Round #368 (Div. 2)
直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...
- Codeforces Round #368 (Div. 2) C. Pythagorean Triples(数学)
Pythagorean Triples 题目链接: http://codeforces.com/contest/707/problem/C Description Katya studies in a ...
- Codeforces Round #368 (Div. 2) B. Bakery (模拟)
Bakery 题目链接: http://codeforces.com/contest/707/problem/B Description Masha wants to open her own bak ...
- Codeforces Round #368 (Div. 2) A. Brain's Photos (水题)
Brain's Photos 题目链接: http://codeforces.com/contest/707/problem/A Description Small, but very brave, ...
- Codeforces Round #368 (Div. 2) D. Persistent Bookcase
Persistent Bookcase Problem Description: Recently in school Alina has learned what are the persisten ...
- Codeforces Round #368 (Div. 2) D. Persistent Bookcase 离线 暴力
D. Persistent Bookcase 题目连接: http://www.codeforces.com/contest/707/problem/D Description Recently in ...
- Codeforces Round #368 (Div. 2)D. Persistent Bookcase DFS
题目链接:http://codeforces.com/contest/707/my 看了这位大神的详细分析,一下子明白了.链接:http://blog.csdn.net/queuelovestack/ ...
- Codeforces Round #368 (Div. 2) E. Garlands 二维树状数组 暴力
E. Garlands 题目连接: http://www.codeforces.com/contest/707/problem/E Description Like all children, Ale ...
- Codeforces Round #368 (Div. 2) C. Pythagorean Triples 数学
C. Pythagorean Triples 题目连接: http://www.codeforces.com/contest/707/problem/C Description Katya studi ...
随机推荐
- HMS Core Discovery直播预告 | AI画质增强 ,开启超清视界
[直播入口] B站华为开发者联盟:http://live.bilibili.com/22551651 4K.8K视频屡见不鲜,HD.FHD分辨率成小屏标配,当网络卡顿.视频自动切换到较低画质时,用户最 ...
- 【Go语言学习笔记】包
包其实是每个大型工程都会使用的模块化工具. 将相关的代码封装成一个包,给其他项目调用,提供不同的功能. GO的设计是将一个文件夹看成一个包,虽然不一定非要用文件夹的名字,但是比较建议. 同一个文件夹下 ...
- Node.js 概述
JavaScript 标准参考教程(alpha) 草稿二:Node.js Node.js 概述 GitHub TOP Node.js 概述 来自<JavaScript 标准参考教程(alpha) ...
- Mysql 常见报错和疑问汇总
1.初始化数据库的时候报错 error while loading shared libraries: libstdc++.so.5: cannot open shared object file: ...
- 【Spring Framework】Spring IOC详解及Bean生命周期详细过程
Spring IOC 首先,在此之前,我们就必须先知道什么是ioc,ioc叫做控制反转,也可以称为依赖注入(DI),实际上依赖注入是ioc的另一种说法, 1.谁控制谁?: 在以前,对象的创建和销毁都是 ...
- 如何使用table布局静态网页
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- numpy基础教程--对数组进行水平拼接和竖直拼接
在处理数组的时候经常要用到拼接,numpy中有两个非常实用的函数,可以快捷对数组进行拼接 1.hstack(tup)函数可以接收维度相同的数组,进行水平拼接. 2.vstack(tup)用来竖直拼接 ...
- CPU状态信息us,sy等含义
目录 一.概述概述 二.详解 us和sy ni id wa hi和si st 三.总结 一.概述概述 比如一秒内有100个cpu时间片,这个cpu时间片就是cpu工作的最小单位.那么这100个cpu时 ...
- [BUUCTF]REVERSE——内涵的软件
内涵的软件 附件 例行检查,32位程序 32位ida载入,shift+f12检索程序里的字符串 看到一个很像flag的字符串,拿去尝试一下,成功 flag{49d3c93df25caad8123213 ...
- Spring事务什么时候会失效?
面试官:Spring事务什么时候会失效? 应聘者: 访问权限问题 方法用final修饰 未被Spring管理 错误的传播特性 自己吞了异常 手动抛了别的异常 自定义了回滚异常 方法内部调用 1.访问权 ...