一个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. gperftools cpp wrapper

    gperftools cpp wrapper // Compile command : ${CXX} -o test_profiler.elf -DUSE_GPERFTOOLS -DDEBUG -D_ ...

  2. gcc/g++ 以及makefile

    生成可执行文件   g++ mutiprocess.cpp -o test -fpic:产生位置无关码,位置无关码就是可以在进程的任意内存位置执行的目标码,动态链接库必须使用 -c : 只生成 .o ...

  3. spring 多数据源配置

    多数据源配置方法: 在配置数据源配置文件中多加一个数据源配置即可: <bean id="dataSource" class="org.apache.commons. ...

  4. requests 抓取网站

    import requests from requests.exceptions import RequestException import re import json def get_one_p ...

  5. vue中watch深度监听

    监听基本类型的都是浅度监听 watch的深度监听,监听复杂类型都是深度监听(funciton ,arrat ,object) // 监听对象 data(){ return { a:{ b:, c: } ...

  6. javascript立体学习指南

    javascript立体学习指南第一章:首先了解javascript 首先,什么是javascript? JavaStrip出生于1995年,是一种文本脚本语言,成都装修公司是一种动态的.弱类型的.基 ...

  7. 自己Linux东西存放情况

    elasticsearch /home/panfeng 包含了 elasticsearch 和 ik分词器 FastDFS https://www.cnblogs.com/taopanfeng/p/1 ...

  8. 币种大写算法(js)

    注意事项:小数精度处理问题,n*10出现精度误差,如1.88*10计算得18.799999999999997,实际想要的数据是18.8: 思路一:小数变成整数(通过字符串处理),计算后,变成小数: 思 ...

  9. Samba Server 的使用者帳號及密碼備份

    Samba Server 自從 3.x 後改成使用 tdbsam 的方式來管理使用者的帳號及密碼,原本的帳號密碼都是存放在 /etc/samba 目錄之下,最近要做備份時,一時之間竟然找不到 Samb ...

  10. 记一次root用户在本地登录及SSH连接均遭遇permission denied的问题排查经过

    某日一位老师反映,机房的6号节点无法登录了.一开始以为是为节点防火墙配置IP白名单时忘记了加进去,但随后发现此节点并未进行白名单配置,密码也一直未有变更,于是在自己的电脑上连接,发现终端里很快显示出了 ...