一个n*m的矩阵,有四种操作:

  1.(i,j)处变1;

  2.(i,j)处变0;

  3.第i行的所有位置1,0反转;

  4.回到第k次操作以后的状态;

  问每次操作以后整个矩阵里面有多少个1。

  其实不好处理的操作只有第四个,但是这题的思路很巧妙,123三种操作全部建立顺边,第四种操作将k和这次操作的序号建边,然后dfs进行操作即可,遇到尽头,则退回到前一个分岔点,并且回溯的过程中将操作反转。

  具体见代码:

  1. #include <stdio.h>
  2. #include <algorithm>
  3. #include <string.h>
  4. #include <vector>
  5. using namespace std;
  6. const int N = + ;
  7.  
  8. int n,m,q,op[N],x[N],y[N],a[+][+];
  9. vector<int> G[N];
  10. int cnt = ,ans[N];
  11.  
  12. void dfs(int u)
  13. {
  14. bool have_changed = ;
  15. if(op[u]== && a[x[u]][y[u]]==) {have_changed = true;a[x[u]][y[u]] = ;cnt++;}
  16. if(op[u]== && a[x[u]][y[u]]==) {have_changed = true;a[x[u]][y[u]] = ;cnt--;}
  17. if(op[u]==)
  18. {
  19. have_changed = true;
  20. for(int i=;i<=m;i++)
  21. {
  22. if(a[x[u]][i] == ) {cnt--;a[x[u]][i] = ;}
  23. else {cnt++;a[x[u]][i] = ;}
  24. }
  25. }
  26. ans[u] = cnt;
  27. for(int i=;i<G[u].size();i++) dfs(G[u][i]);
  28. if(!have_changed) return;
  29. if(op[u]==) {a[x[u]][y[u]] = ;cnt--;}
  30. if(op[u]==) {a[x[u]][y[u]] = ;cnt++;}
  31. if(op[u]==)
  32. {
  33. for(int i=;i<=m;i++)
  34. {
  35. if(a[x[u]][i] == ) {cnt--;a[x[u]][i] = ;}
  36. else {cnt++;a[x[u]][i] = ;}
  37. }
  38. }
  39. }
  40.  
  41. int main()
  42. {
  43. scanf("%d%d%d",&n,&m,&q);
  44. for(int i=;i<=q;i++)
  45. {
  46. scanf("%d",op+i);
  47. if(op[i]<=) scanf("%d%d",x+i,y+i);
  48. else scanf("%d",x+i);
  49. if(op[i] == ) G[x[i]].push_back(i);
  50. else G[i-].push_back(i);
  51. }
  52. for(int i=;i<G[].size();i++) dfs(G[][i]);
  53. for(int i=;i<=q;i++) printf("%d\n",ans[i]);
  54. }

CodeForces 707D Persistent Bookcase ——(巧妙的dfs)的更多相关文章

  1. 【离线】【深搜】【树】Codeforces 707D Persistent Bookcase

    题目链接: http://codeforces.com/problemset/problem/707/D 题目大意: 一个N*M的书架,支持4种操作 1.把(x,y)变为有书. 2.把(x,y)变为没 ...

  2. Codeforces 707D Persistent Bookcase(时间树)

    [题目链接] http://codeforces.com/problemset/problem/707/D [题目大意] 给出一个矩阵,要求满足如下操作,单个位置x|=1或者x&=0,一行的数 ...

  3. CodeForces 707D Persistent Bookcase

    $dfs$,优化. $return$操作说明该操作完成之后的状态和经过操作$k$之后的状态是一样的.因此我们可以建树,然后从根节点开始$dfs$一次(回溯的时候复原一下状态)就可以算出所有状态的答案. ...

  4. cf707D. Persistent Bookcase(离线+dfs)

    题目链接:http://codeforces.com/problemset/problem/707/D  有一个n*m的书架,有K个操作,求每个操作后一共有多少本书:有4种操作: 1:x y 如果 x ...

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

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

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

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

  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 #368 div2 D Persistent Bookcase DFS

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

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

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

随机推荐

  1. Aveva Marine C# 二次开发入门001

    1# 引用 C:\AVEVA\Marine\OH12.1.SP4\Aveva.ApplicationFramework.dll C:\AVEVA\Marine\OH12.1.SP4\Aveva.App ...

  2. [转载]python with语句的用法

    https://www.cnblogs.com/DswCnblog/p/6126588.html 看这篇文章的时候看到了python的类名()用法,很好奇,上网查了下,原来这就相当于对类进行实例化了. ...

  3. SSH远程连接工具汇总

    1)Xshell 常见问题: 1) 终端中的字体横向显示 字体中带有@的均为横向字体, 只要选择一个不带@的字体即可 2)putty 常见问题: 1)putty中编辑脚本,文字呈现蓝色,辨识度较差,需 ...

  4. vue2.0+按需引入element-ui报错

    项目使用vue脚手架自动生成的,vue版本为^2.5.16.项目中需要按需使用element-ui,根据element-ui的官方文档,一开始在babel.config.js文件中修改配置 modul ...

  5. web端文件上传,预览,下载,删除

      //HTML部分 <div class="item attachment attachmentNew"> <span class="name&quo ...

  6. LeetCode NO477.汉明距离总和

    两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量. 计算一个数组中,任意两个数之间汉明距离的总和. 示例: 输入: 4, 14, 2 输出: 6 解释: 在二进制表示中,4表示为010 ...

  7. Beta冲刺版本第三天

    该作业所属课程:https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass2 作业要求地址:https://edu.cnblogs.com ...

  8. (七)zabbix监控nginx

    1.agent端配置 1)nginx编译安装需要加上该选项--with-http_stub_status_module 2)修改nginx配置文件 #vim /usr/local/nginx/conf ...

  9. POJ - 1185 炮兵阵地 (插头dp)

    题目链接 明明是道状压dp的题我为啥非要用插头dp乱搞啊 逐行枚举,设dp[i][S]为枚举到第i个格子时,状态为S的情况.S为当前行上的“插头”状态,每两个二进制位表示一个格子,设当前格子为(x,y ...

  10. WPF界面开发必备技能!TreeListView - 如何快速更新多个项目属性

    DevExpress广泛应用于ECM企业内容管理. 成本管控.进程监督.生产调度,在企业/政务信息化管理中占据一席重要之地.通过DevExpress WPF Controls,您能创建有着强大互动功能 ...