题目链接:http://codeforces.com/problemset/problem/707/D

 有一个n*m的书架,有K个操作,求每个操作后一共有多少本书;有4种操作;

1:x y 如果 x y 位置没有书,放一本书在上面;

2:x y如果 x y 位置有书,移走;

3:x,表示把第x行的所有又书的拿走,没书的放上去;

4:k,回到第k个操作后的状态;

离线处理k个操作;当操作不为 4 时,把操作i连在i-1后,=4时把操作 i 连在a[i].x后;

这样建一棵树,然后遍历即可,在回溯的时候注意更改书架的状态即可;

#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdio.h>
#include<math.h>
#include<vector>
using namespace std;
#define N 1005
#define PI 4*atan(1.0)
#define mod 1000000007
#define met(a, b) memset(a, b, sizeof(a))
typedef long long LL; struct node
{
int op, x, y, ans;
}a[N*N];///k个操作; int cnt[N][N];///记录书架的状态;
int n, m, k;
vector<vector<int> > G;///操作形成的图; void dfs(int u)
{
if(a[u].op == )
{
int flag = ;
if(cnt[a[u].x][a[u].y] == )
{
flag = ;
a[u].ans ++;///在已有的基础上加上更改的值;
cnt[a[u].x][a[u].y] = ;///标记状态;
}
for(int i=, len=G[u].size(); i<len; i++)
{
int v = G[u][i];
a[v].ans = a[u].ans;///往下走的时候,v是u的儿子,所以拥有u的ans;
dfs(v);
}
if(flag)///回溯时要重新更改状态;
cnt[a[u].x][a[u].y] = ;
}
else if(a[u].op == )
{
int flag = ;
if(cnt[a[u].x][a[u].y] == )
{
flag = ;
a[u].ans --;
cnt[a[u].x][a[u].y] = ;
}
for(int i=, len=G[u].size(); i<len; i++)
{
int v = G[u][i];
a[v].ans = a[u].ans;
dfs(v);
}
if(flag)
cnt[a[u].x][a[u].y] = ;
}
else if(a[u].op == )
{
int num = ;
for(int i=; i<=m; i++)
{
if(cnt[a[u].x][i] == )
num ++;
cnt[a[u].x][i] ^= ;
}
a[u].ans = a[u].ans - num + (m-num);///更新ans;
for(int i=, len=G[u].size(); i<len; i++)
{
int v = G[u][i];
a[v].ans = a[u].ans;
dfs(v);
}
for(int i=; i<=m; i++)
cnt[a[u].x][i] ^= ;
}
else
{
for(int i=, len=G[u].size(); i<len; i++)
{
int v = G[u][i];
a[v].ans = a[u].ans;
dfs(v);
}
}
} int main()
{
while(scanf("%d %d %d", &n, &m, &k)!=EOF)
{
met(a, );
met(cnt, );
G.clear();
G.resize(k+); for(int i=; i<=k; i++)
{
scanf("%d", &a[i].op);
if(a[i].op <= )
scanf("%d %d", &a[i].x, &a[i].y);
else
scanf("%d", &a[i].x); if(a[i].op <= )
G[i-].push_back(i);
else
G[a[i].x].push_back(i);
} for(int i=, len=G[].size(); i<len; i++)
dfs(G[][i]); for(int i=; i<=k; i++)
printf("%d\n", a[i].ans);
}
return ;
}

cf707D. Persistent Bookcase(离线+dfs)的更多相关文章

  1. CF707D Persistent Bookcase

    CF707D Persistent Bookcase 洛谷评测传送门 题目描述 Recently in school Alina has learned what are the persistent ...

  2. Codeforces Round #368 (Div. 2) D. Persistent Bookcase 离线 暴力

    D. Persistent Bookcase 题目连接: http://www.codeforces.com/contest/707/problem/D Description Recently in ...

  3. CF707D Persistent Bookcase 可持久化线段树

    维护一个二维零一矩阵(n,m<=1000),支持四种操作(不超过10^5次): 将(i,j)置一 将(i,j)置零 将第i行零一反转yu 回到第K次操作前的状态 每次操作后输出全局一共有多少个一 ...

  4. Persistent Bookcase CodeForces - 707D (dfs 离线处理有根树模型的问题&&Bitset)

    Persistent Bookcase CodeForces - 707D time limit per test 2 seconds memory limit per test 512 megaby ...

  5. CodeForces #368 div2 D Persistent Bookcase DFS

    题目链接:D Persistent Bookcase 题意:有一个n*m的书架,开始是空的,现在有k种操作: 1 x y 这个位置如果没书,放书. 2 x y 这个位置如果有书,拿走. 3 x 反转这 ...

  6. 【Codeforces-707D】Persistent Bookcase DFS + 线段树

    D. Persistent Bookcase Recently in school Alina has learned what are the persistent data structures: ...

  7. codeforces 707D D. Persistent Bookcase(dfs)

    题目链接: D. Persistent Bookcase time limit per test 2 seconds memory limit per test 512 megabytes input ...

  8. Codeforces Round #368 (Div. 2) D. Persistent Bookcase

    Persistent Bookcase Problem Description: Recently in school Alina has learned what are the persisten ...

  9. 离线dfs CF div2 707 D

    http://codeforces.com/contest/707/problem/D 先说一下离线和在线:在线的意思就是每一个询问单独处理复杂度O(多少多少),离线是指将所有的可能的询问先一次都处理 ...

随机推荐

  1. shell 之for [转]

    本文也即<Learning the bash Shell>3rd Edition的第五章Flow Control之读书笔记之二,但我们将不限于此.flow control是任何编程语言中很 ...

  2. Matlab Delete Row or Col 删除矩阵的行或列

    Matlab中,我们有时候要删除矩阵中的某行某列,可以采用下列方法进行删除: a = [ ]; a(,:) = []; % Delete row a(:,) = []; % Delete col

  3. [百科]sys/types.h

    sys/types.h中文名称为基本系统数据类型.在应用程序源文件中包含 <sys/types.h> 以访问 _LP64 和 _ILP32 的定义.此头文件还包含适当时应使用的多个基本派生 ...

  4. 在Windows2003上安装Active Directory Management Gateway Service

    为了让基于Windows2003的域控能够被Powershell管理,必须安装KB968934,但是直接安装会报以下的错误,必须先安装NDP35SP1-KB969166.但是"因为基于 Wi ...

  5. 【新产品发布】《EVC8021 RS-232<>RS-485/422 隔离接口转换器》

    [数据手册下载] 1.百度云盘:(把下面蓝色连接复制到浏览器下打开) http://pan.baidu.com/s/1eQlJ0zC 2.淘宝公司的淘云盘:(点击下面连接后,需要用淘宝账户登录) ht ...

  6. 【转】Java跨平台原理

    原文地址:http://www.cnblogs.com/gw811/archive/2012/09/09/2677386.html 1.是么是平台 Java是可以跨平台的编程语言,那我们首先得知道什么 ...

  7. jQuery EasyUI DataGrid Checkbox 数据设定与取值

    纯粹做个记录,以免日后忘记该怎么设定. 这一篇将会说明两种使用 jQuery EasyUI DataGrid 的 Checkbox 设定方式,以及在既有数据下将 checked 为 true 的该笔数 ...

  8. Frenetic Python实验(一)

    Follow: Github-Frenetic 准备: 所有的实验,第一步都需要开启控制器,命令: $ frenetic http-controller --verbosity debug 每一个实验 ...

  9. MySQL DATE_FORMAT() 函数

    定义和用法 DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据. 语法 DATE_FORMAT(date,format) date 参数是合法的日期.format 规定日期/时间的输出 ...

  10. 【翻译】CEDEC2014 CAPCOM 照相机正确的照片真实的制作工作流

     这次带来的翻译是Capcom在CEDEC2014上发表的技术美术相关的资料.资料的目的,就是在已经拥有了一套基于物理的渲染引擎的前提下,如何进行图片真实的材料的拍摄并制作为引擎里的材质,以及如何正确 ...