题目链接: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后;

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

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<string.h>
  4. #include<stdio.h>
  5. #include<math.h>
  6. #include<vector>
  7. using namespace std;
  8. #define N 1005
  9. #define PI 4*atan(1.0)
  10. #define mod 1000000007
  11. #define met(a, b) memset(a, b, sizeof(a))
  12. typedef long long LL;
  13.  
  14. struct node
  15. {
  16. int op, x, y, ans;
  17. }a[N*N];///k个操作;
  18.  
  19. int cnt[N][N];///记录书架的状态;
  20. int n, m, k;
  21. vector<vector<int> > G;///操作形成的图;
  22.  
  23. void dfs(int u)
  24. {
  25. if(a[u].op == )
  26. {
  27. int flag = ;
  28. if(cnt[a[u].x][a[u].y] == )
  29. {
  30. flag = ;
  31. a[u].ans ++;///在已有的基础上加上更改的值;
  32. cnt[a[u].x][a[u].y] = ;///标记状态;
  33. }
  34. for(int i=, len=G[u].size(); i<len; i++)
  35. {
  36. int v = G[u][i];
  37. a[v].ans = a[u].ans;///往下走的时候,v是u的儿子,所以拥有u的ans;
  38. dfs(v);
  39. }
  40. if(flag)///回溯时要重新更改状态;
  41. cnt[a[u].x][a[u].y] = ;
  42. }
  43. else if(a[u].op == )
  44. {
  45. int flag = ;
  46. if(cnt[a[u].x][a[u].y] == )
  47. {
  48. flag = ;
  49. a[u].ans --;
  50. cnt[a[u].x][a[u].y] = ;
  51. }
  52. for(int i=, len=G[u].size(); i<len; i++)
  53. {
  54. int v = G[u][i];
  55. a[v].ans = a[u].ans;
  56. dfs(v);
  57. }
  58. if(flag)
  59. cnt[a[u].x][a[u].y] = ;
  60. }
  61. else if(a[u].op == )
  62. {
  63. int num = ;
  64. for(int i=; i<=m; i++)
  65. {
  66. if(cnt[a[u].x][i] == )
  67. num ++;
  68. cnt[a[u].x][i] ^= ;
  69. }
  70. a[u].ans = a[u].ans - num + (m-num);///更新ans;
  71. for(int i=, len=G[u].size(); i<len; i++)
  72. {
  73. int v = G[u][i];
  74. a[v].ans = a[u].ans;
  75. dfs(v);
  76. }
  77. for(int i=; i<=m; i++)
  78. cnt[a[u].x][i] ^= ;
  79. }
  80. else
  81. {
  82. for(int i=, len=G[u].size(); i<len; i++)
  83. {
  84. int v = G[u][i];
  85. a[v].ans = a[u].ans;
  86. dfs(v);
  87. }
  88. }
  89. }
  90.  
  91. int main()
  92. {
  93. while(scanf("%d %d %d", &n, &m, &k)!=EOF)
  94. {
  95. met(a, );
  96. met(cnt, );
  97. G.clear();
  98. G.resize(k+);
  99.  
  100. for(int i=; i<=k; i++)
  101. {
  102. scanf("%d", &a[i].op);
  103. if(a[i].op <= )
  104. scanf("%d %d", &a[i].x, &a[i].y);
  105. else
  106. scanf("%d", &a[i].x);
  107.  
  108. if(a[i].op <= )
  109. G[i-].push_back(i);
  110. else
  111. G[a[i].x].push_back(i);
  112. }
  113.  
  114. for(int i=, len=G[].size(); i<len; i++)
  115. dfs(G[][i]);
  116.  
  117. for(int i=; i<=k; i++)
  118. printf("%d\n", a[i].ans);
  119. }
  120. return ;
  121. }

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. url上使用#号好不好

    这是一篇摘自百度站长工具的文章. 一般来说,url当中的#号是一个锚点的标志位,这样的url打开之后会将访问者的视线定位在指定位置上,令访问者直接看到网页中间的一段内容.自从推特流行开始,#号被附予了 ...

  2. 关于实现banner轮换的问题,如何修改

    最近遇到了这样的问题,本来banner都是gif格式的,但是现在要求上传图片格式为jpg时,运用JS实现动画效果,原来的也能用. aspx: <div id="bh" run ...

  3. QInputDialog 使用方法

    在Qt中,如果想快速生成一个对话框,可以和用户进行简单的交互,而不需要写一个新的类的时候,就要用到QInputDialog类,这个类就是专门用来建立简单对话框的,其主要能建下列几种对话框:

  4. javascript 三个 对话框

    用法: 一般写在 </html>之后,<script language="javascript">代码必须放在这里面</script> 三个常用 ...

  5. JS让input按钮不能点击

    <input value="开通" type="button" id="tijiao" class="button" ...

  6. WPF的Page介绍及Page Window Frame 之间的链接使用示例,嵌套问题

    本文源参考 http://www.cnblogs.com/ListenFly/archive/2013/02/24/2923474.html 谢谢源作者 WPF中的Page相比Window来说更加的精 ...

  7. centeros iptable模板文件

    iptables规则是空的.而且他们的selinux是关闭了的,这等同于把系统裸奔(总比windows裸奔好).   使用方法: 1.用root用户登录后 vi /etc/sysconfig/ipta ...

  8. require(__DIR__ . "/../sss.php"

    魔法函数  __DIR__ 是 php5.2以后新加的函数,返回当前文件所在的目录,返回的目录不带 \,所以上边的意思是:Require当前目录的父目录中的 sss.php

  9. PHP 错误与异常 笔记与总结(7)将错误日志以邮件方式发送

    当系统发生了很严重的问题,需要立刻发送给管理员.可以通过 error_log() 将错误以邮件形式发送到邮箱. 在 php.ini 中设置: sendmail_from = 472323087@qq. ...

  10. Web 在线文件管理器学习笔记与总结(17)复制文件 (18)剪切文件

    (17)复制文件 ① 复制文件通过copy($src,$dst) 来实现 ② 检测目标目录是否存在,如果存在则继续检测目标目录中是否存在同名文件,如果不存在则复制成功 file.func.php 中添 ...