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 ...
随机推荐
- phpexcel 另存Excel文件方式
$w = new PHPExcel_Writer_Excel5($e); $dir = 'path/title.xls'; $w->save($dir);
- FFmpeg笔记:使用MSVC工具链编译Windows版本静态库、动态库
2019年3月开始,为了将音视频编解码功能集成到Cocos2d-x中,开始接触到FFmpeg: 当时开发环境还在Mac下,编译FFmpeg相比现在用Windows平台要方便的多: 最近,公司内部有个U ...
- Linux内存管理和寻址详解
1.概念 内存管理模式 段式:内存分为了多段,每段都是连续的内存,不同的段对应不用的用途.每个段的大小都不是统一的,会导致内存碎片和内存交换效率低的问题. 页式:内存划分为多个内存页进行管理,如在 L ...
- 【MPI环境配置】 vs2019配置MPI环境
MPI 即 Message-Passing Interface,提供了一系列并行编程的接口,为了在本机能够学习和使用并行编程,需要提前安装MPI; 配置环境: Microsoft Visual Stu ...
- Oracle中的null与空字符串''的区别
含义解释:问:什么是NULL?答:在我们不知道具体有什么数据的时候,也即未知,可以用NULL,我们称它为空,ORACLE中,含有空值的表列长度为零.ORACLE允许任何一种数据类型的字段为空,除了以下 ...
- tableView和tableViewCell的背景颜色问题
当在tableView中添加cell数据时,我们会发现原本设置的tableView的背景颜色不见了,这是因为加载cell数据时,tableView的背景颜色被cell数据遮盖住了,此时,可以通过设置c ...
- go channel 概述
精髓 将资源读进内存-->共享内存,一个个进程/线程进行处理,这是常见模式.go channel 是一种直接在进程/线程之间传递资源的方式,即以通信来共享内存.这便是go的精髓. 扩展-一些名词 ...
- Spring Boot简单操作
目录 一.自定义异常页面 二.单元测试 三.多环境选择 四.读取主配置文件中的属性 五.读取List属性 一.自定义异常页面 对于404.405.500等异常状态,服务器会给出默认的异常页面,而这些 ...
- 出现 CannotAcquireLockException 异常
项目出现 CannotAcquireLockException异常 原因: 百度了一下,是由于 Spring 事务嵌套造成死锁 结合自己的, handleWithdraw 方法底层有调用 其他 se ...
- 什么是maven(一)
转自博主--一杯凉茶 我记得在搞懂maven之前看了几次重复的maven的教学视频.不知道是自己悟性太低还是怎么滴,就是搞不清楚,现在弄清楚了,基本上入门了.写该篇博文,就是为了帮助那些和我一样对于m ...