CodeForces 707D Persistent Bookcase ——(巧妙的dfs)
一个n*m的矩阵,有四种操作:
1.(i,j)处变1;
2.(i,j)处变0;
3.第i行的所有位置1,0反转;
4.回到第k次操作以后的状态;
问每次操作以后整个矩阵里面有多少个1。
其实不好处理的操作只有第四个,但是这题的思路很巧妙,123三种操作全部建立顺边,第四种操作将k和这次操作的序号建边,然后dfs进行操作即可,遇到尽头,则退回到前一个分岔点,并且回溯的过程中将操作反转。
具体见代码:
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
using namespace std;
const int N = + ; int n,m,q,op[N],x[N],y[N],a[+][+];
vector<int> G[N];
int cnt = ,ans[N]; void dfs(int u)
{
bool have_changed = ;
if(op[u]== && a[x[u]][y[u]]==) {have_changed = true;a[x[u]][y[u]] = ;cnt++;}
if(op[u]== && a[x[u]][y[u]]==) {have_changed = true;a[x[u]][y[u]] = ;cnt--;}
if(op[u]==)
{
have_changed = true;
for(int i=;i<=m;i++)
{
if(a[x[u]][i] == ) {cnt--;a[x[u]][i] = ;}
else {cnt++;a[x[u]][i] = ;}
}
}
ans[u] = cnt;
for(int i=;i<G[u].size();i++) dfs(G[u][i]);
if(!have_changed) return;
if(op[u]==) {a[x[u]][y[u]] = ;cnt--;}
if(op[u]==) {a[x[u]][y[u]] = ;cnt++;}
if(op[u]==)
{
for(int i=;i<=m;i++)
{
if(a[x[u]][i] == ) {cnt--;a[x[u]][i] = ;}
else {cnt++;a[x[u]][i] = ;}
}
}
} int main()
{
scanf("%d%d%d",&n,&m,&q);
for(int i=;i<=q;i++)
{
scanf("%d",op+i);
if(op[i]<=) scanf("%d%d",x+i,y+i);
else scanf("%d",x+i);
if(op[i] == ) G[x[i]].push_back(i);
else G[i-].push_back(i);
}
for(int i=;i<G[].size();i++) dfs(G[][i]);
for(int i=;i<=q;i++) printf("%d\n",ans[i]);
}
CodeForces 707D Persistent Bookcase ——(巧妙的dfs)的更多相关文章
- 【离线】【深搜】【树】Codeforces 707D Persistent Bookcase
题目链接: http://codeforces.com/problemset/problem/707/D 题目大意: 一个N*M的书架,支持4种操作 1.把(x,y)变为有书. 2.把(x,y)变为没 ...
- Codeforces 707D Persistent Bookcase(时间树)
[题目链接] http://codeforces.com/problemset/problem/707/D [题目大意] 给出一个矩阵,要求满足如下操作,单个位置x|=1或者x&=0,一行的数 ...
- CodeForces 707D Persistent Bookcase
$dfs$,优化. $return$操作说明该操作完成之后的状态和经过操作$k$之后的状态是一样的.因此我们可以建树,然后从根节点开始$dfs$一次(回溯的时候复原一下状态)就可以算出所有状态的答案. ...
- cf707D. Persistent Bookcase(离线+dfs)
题目链接:http://codeforces.com/problemset/problem/707/D 有一个n*m的书架,有K个操作,求每个操作后一共有多少本书:有4种操作: 1:x y 如果 x ...
- Codeforces Round #368 (Div. 2) D. Persistent Bookcase
Persistent Bookcase Problem Description: Recently in school Alina has learned what are the persisten ...
- Persistent Bookcase CodeForces - 707D (dfs 离线处理有根树模型的问题&&Bitset)
Persistent Bookcase CodeForces - 707D time limit per test 2 seconds memory limit per test 512 megaby ...
- codeforces 707D D. Persistent Bookcase(dfs)
题目链接: D. Persistent Bookcase time limit per test 2 seconds memory limit per test 512 megabytes input ...
- CodeForces #368 div2 D Persistent Bookcase DFS
题目链接:D Persistent Bookcase 题意:有一个n*m的书架,开始是空的,现在有k种操作: 1 x y 这个位置如果没书,放书. 2 x y 这个位置如果有书,拿走. 3 x 反转这 ...
- Codeforces Round #368 (Div. 2) D. Persistent Bookcase 离线 暴力
D. Persistent Bookcase 题目连接: http://www.codeforces.com/contest/707/problem/D Description Recently in ...
随机推荐
- Bootstrap页面响应式设计
关键词:viewport.栅格布局.媒体查询(Media Queries) 一.关于栅格布局的说明: 1.基本图解 extra small devices phones 超小型设备手机small d ...
- 详解CSS居中布局技巧
本文转自:https://zhuanlan.zhihu.com/p/25068655#showWechatShareTip一.水平居中元素: 1.通用方法,元素的宽高未知方式一:CSS3 transf ...
- day06 Python class基础篇
一.目录 1.类与对象的概述 2.封装 3.继承 4.多态 5.类的成员 6.类与类之间的关系 7.私有 二. 内容讲解 一.类与对象的概述 类是对一系列具有相同属性的事物的抽象,相同于设计图纸,而对 ...
- Java必考题目之JVM面试题目和答案
JVM内存模型 首先我们来了解一下JVM的内存模型的怎么样的: 1.堆:存放对象实例,几乎所有的对象实例都在这里分配内存 堆得内存由-Xms指定,默认是物理内存的1/64:最大的内存由-Xmx指定,默 ...
- Flutter-动画-实践篇
一.了解AnimatedWidget 通常我们给一个Widget添加动画的时候都需要监听Animation的addListener()方法,并在这个方法里面不停的调用setState()方法通知Wei ...
- 【Swift后台】环境安装
macOS 在macOS上使用Vapor,需要Xcode 9.3或更高版本.Swift 4.1或更高版本.安装还需要Homebrew命令. 检查Swift版本: swift --version Vap ...
- Shell-使用mkfifo实现多任务并发及并发数控制
以下为代码实现的一个模拟场景:3个生产者,在不断提供服务,处理需求,假设1s处理一个. 20个消费者,在不断消耗供给产品,提交需求,假设3s消耗一个. 情景分析:由于消费者的提交需求能力 和 生产者处 ...
- shell脚本中的EOF以及文件重定向
<<EOF (内容) EOF 可以把EOF替换成其他东西(分解符) 意思是把内容当作标准输入传给程序 这里再简要回顾一下<<的用法.当Shell看到<<的时 ...
- Linux (Ubuntu)使用vi和vim方向键变成了ABCD
ubuntu下 vi输入方向键会变成ABCD,这是ubuntu预装的是vim tiny版本,安装vim full版本即可解决. 首先,卸载了原有的vim $ sudo apt-get remove v ...
- UVA 1482 SG打表
打出SG表来可以很容易的发现i为偶数时 SG[i]=i/2 i为奇数时 SG[i]=SG[i/2] #include<bits/stdc++.h> typedef long long ll ...