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

【题目大意】

  给出一个矩阵,要求满足如下操作,单个位置x|=1或者x&=0,一行的数全部取反,回到第k个操作。要求每次操作后输出这个矩阵中数字的和。

【题解】

  由于存在操作回溯,考虑使用可持久化数据结构或者建立离线操作树。因为懒,没写持久化。对于每个操作,将它和时间顺序上的上一个节点连边,这样子就形成了一棵树,对这棵树从根节点开始遍历,递归处理,每次处理完一棵子树就回溯操作,这样子就能离线处理操作的持久化了。

【代码】

  1. #include <cstdio>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5. const int N=1005,M=100005;
  6. int k,q,n,m,t[N],f[N][N],s[N],last=0,ans[M],op[M],x[M],y[M],id[M];
  7. vector<int> v[M];
  8. void dfs(int pre,int w){
  9. int flag=0;
  10. if(op[w]==1){
  11. if(f[x[w]][y[w]]^t[x[w]])ans[w]=ans[pre];
  12. else{
  13. f[x[w]][y[w]]^=1;
  14. if(f[x[w]][y[w]])s[x[w]]++,flag=1;else s[x[w]]--;
  15. ans[w]=ans[pre]+1;
  16. }
  17. }else if(op[w]==2){
  18. if(f[x[w]][y[w]]^t[x[w]]){
  19. f[x[w]][y[w]]^=1;
  20. if(f[x[w]][y[w]])s[x[w]]++,flag=1;else s[x[w]]--;
  21. ans[w]=ans[pre]-1;
  22. }else ans[w]=ans[pre];
  23. }else if(op[w]==3){
  24. if(t[x[w]]==0)ans[w]=ans[pre]-s[x[w]]+m-s[x[w]];
  25. else ans[w]=ans[pre]-(m-s[x[w]])+s[x[w]];
  26. t[x[w]]^=1;
  27. }
  28. for(int i=0;i<v[w].size();i++)dfs(w,v[w][i]);
  29. if(op[w]==1){
  30. if(ans[w]!=ans[pre]){
  31. f[x[w]][y[w]]^=1;
  32. if(flag)s[x[w]]--;else s[x[w]]++;
  33. }
  34. }else if(op[w]==2){
  35. if(ans[w]!=ans[pre]){
  36. f[x[w]][y[w]]^=1;
  37. if(flag)s[x[w]]--;else s[x[w]]++;
  38. }
  39. }else if(op[w]==3){
  40. t[x[w]]^=1;
  41. }
  42. }
  43. int main(){
  44. scanf("%d%d%d",&n,&m,&q);
  45. for(int i=1;i<=q;i++){
  46. scanf("%d",&op[i]);
  47. if(op[i]==1){
  48. scanf("%d%d",x+i,y+i);
  49. v[last].push_back(id[i]=i);
  50. last=i;
  51. }else if(op[i]==2){
  52. scanf("%d%d",x+i,y+i);
  53. v[last].push_back(id[i]=i);
  54. last=i;
  55. }else if(op[i]==3){
  56. scanf("%d",x+i);
  57. v[last].push_back(id[i]=i);
  58. last=i;
  59. }else{
  60. scanf("%d",&k);
  61. last=id[i]=id[k];
  62. }
  63. }dfs(0,0);
  64. for(int i=1;i<=q;i++)printf("%d\n",ans[id[i]]);
  65. return 0;
  66. }

Codeforces 707D Persistent Bookcase(时间树)的更多相关文章

  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

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

  3. CodeForces 707D Persistent Bookcase ——(巧妙的dfs)

    一个n*m的矩阵,有四种操作: 1.(i,j)处变1: 2.(i,j)处变0: 3.第i行的所有位置1,0反转: 4.回到第k次操作以后的状态: 问每次操作以后整个矩阵里面有多少个1. 其实不好处理的 ...

  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 707D D. Persistent Bookcase(dfs)

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

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

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

  7. CodeForces #368 div2 D Persistent Bookcase DFS

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

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

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

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

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

随机推荐

  1. java Timer 使用小结

    Java自带的java.util.Timer类,通过调度一个java.util.TimerTask任务.这种方式可以让程序按照某一个频度执行,但不能指定时间运行.用的较少. 任务的调用通过起的子线程进 ...

  2. Sublime_调试PHP编译系统设置.

    工具->编译系统->新建编译系统 {         "cmd": ["C:\\wampserver\\bin\\php\\php5.3.13\\php.ex ...

  3. hdu 5755 Gambler Bo 高斯消元

    题目链接 给n*m的方格, 每个格子有值{0, 1, 2}. 然后可以对格子进行操作, 如果选择了一个格子, 那么这个格子的值+2, 这个格子上下左右的格子+1, 并且模3. 问你将所有格子变成0的操 ...

  4. WinCmd

    Q1:tracert Tracert (跟踪路由)是路由跟踪实用程序,用于确定 IP 数据报访问目标所采取的路径. Tracert 命令用 IP 生存时间 (TTL) 字段和 ICMP 错误消息来确定 ...

  5. Android 显示YUV编码格式

    ByteArrayOutputStream out = new ByteArrayOutputStream(); String path = "res/drawable/sample.yuv ...

  6. 在非MVC环境下使用 Razor引擎

    Razor引擎下载地址: http://github.com/Antaris/RazorEngine 解析Model: string template = "Hello @Model.Nam ...

  7. Google机器学习教程心得(一)

    Hello world Google Machine Learning Recipes 1 官方中文博客 http://chinagdg.org/2016/03/machine-learning-re ...

  8. jenkins中Deploy to container Plugin插件发布配置

    参数详解: 第一项(WAR/EAR files):是war包的相对路径(相对于工作区路径,即在工作区中war包的相对路径.)如我的maven执行完成之后会在工作区的target目录下生成项目.war, ...

  9. FLASH MAGIC LPC ISP下载方式说明

    硬件:EASYARM2131 开发板软件:FLASH MAGIC     下载地址:http://www.flashmagictool.com/程序:Demo2131.hex LPC的ISP下载方式, ...

  10. CxImage的使用

    1.首先从此处下载源代码 http://www.codeproject.com/KB/graphics/cximage.aspx 2.然后将里面的工程全部编译一下,我觉得应该是生成对应的库. 3.然后 ...