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 ...
随机推荐
- 34、在排序数组中查找元素的第一个和最后一个位置 | 算法(leetode,附思维导图 + 全部解法)300题
零 标题:算法(leetode,附思维导图 + 全部解法)300题之(34)在排序数组中查找元素的第一个和最后一个位置 一 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: / ...
- C语言中的各种类型所占的字节大小
一)64位系统和32位有什么区别? 1.64bit CPU拥有更大的寻址能力,最大支持到16GB内存,而32bit只支持4G内存 2.64位CPU一次可提取64位数据,比32位提高了一倍,理论上性能 ...
- 日常Java 2021/9/21
将Java数组中的元素前后反转.题目要求:已知一个数组arr = {11,12,13,14,15}用程序实现把该数组中的元素值交换,交换后的数组arr = { 15,14,13,12,11},并输出交 ...
- 学习java 7.16
学习内容: 线程安全的类 Lock锁 生产者消费者模式 Object类的等待唤醒方法 明天内容: 网络编程 通信程序 遇到问题: 无
- A Child's History of England.23
King William, fearing he might lose his conquest, came back, and tried to pacify the London people b ...
- day18定时任务
day18定时任务 什么是定时任务 类似日常生活之中的闹钟:主要用于定时执行某些命令,达到定时处理数据的作用. 作用: 1.类似生活中使用的闹钟 2.可以自动完成操作命令 3.定时备份系统数据信息 定 ...
- 大数据学习day34---spark14------1 redis的事务(pipeline)测试 ,2. 利用redis的pipeline实现数据统计的exactlyonce ,3 SparkStreaming中数据写入Hbase实现ExactlyOnce, 4.Spark StandAlone的执行模式,5 spark on yarn
1 redis的事务(pipeline)测试 Redis本身对数据进行操作,单条命令是原子性的,但事务不保证原子性,且没有回滚.事务中任何命令执行失败,其余的命令仍会被执行,将Redis的多个操作放到 ...
- 零基础学习java------40---------Maven(maven的概念,安装,maven在eclipse中使用),springboot(spring整合springmvc(注解),spring整合mybatis(常见的配置文件)),前端页面(bootstrap软件)
一 maven 1. Maven的相关概念 1.1 项目开发中遇到的问题 (1)都是同样的代码,为什么在我的机器上可以编译执行,而在他的机器上就不行? (2)为什么在我的机器上可以正常打包,而配置管理 ...
- Can we use function on left side of an expression in C and C++?
In C, it might not be possible to have function names on left side of an expression, but it's possib ...
- 数据库系统相关SQL
杀进程 查出所有被锁住的表 select b.owner TABLEOWNER, b.object_name TABLENAME, c.OSUSER LOCKBY, c.USERNAME LOGINI ...