Codeforces 707D Persistent Bookcase(时间树)
【题目链接】 http://codeforces.com/problemset/problem/707/D
【题目大意】
给出一个矩阵,要求满足如下操作,单个位置x|=1或者x&=0,一行的数全部取反,回到第k个操作。要求每次操作后输出这个矩阵中数字的和。
【题解】
由于存在操作回溯,考虑使用可持久化数据结构或者建立离线操作树。因为懒,没写持久化。对于每个操作,将它和时间顺序上的上一个节点连边,这样子就形成了一棵树,对这棵树从根节点开始遍历,递归处理,每次处理完一棵子树就回溯操作,这样子就能离线处理操作的持久化了。
【代码】
- #include <cstdio>
- #include <vector>
- #include <algorithm>
- using namespace std;
- const int N=1005,M=100005;
- int k,q,n,m,t[N],f[N][N],s[N],last=0,ans[M],op[M],x[M],y[M],id[M];
- vector<int> v[M];
- void dfs(int pre,int w){
- int flag=0;
- if(op[w]==1){
- if(f[x[w]][y[w]]^t[x[w]])ans[w]=ans[pre];
- else{
- f[x[w]][y[w]]^=1;
- if(f[x[w]][y[w]])s[x[w]]++,flag=1;else s[x[w]]--;
- ans[w]=ans[pre]+1;
- }
- }else if(op[w]==2){
- if(f[x[w]][y[w]]^t[x[w]]){
- f[x[w]][y[w]]^=1;
- if(f[x[w]][y[w]])s[x[w]]++,flag=1;else s[x[w]]--;
- ans[w]=ans[pre]-1;
- }else ans[w]=ans[pre];
- }else if(op[w]==3){
- if(t[x[w]]==0)ans[w]=ans[pre]-s[x[w]]+m-s[x[w]];
- else ans[w]=ans[pre]-(m-s[x[w]])+s[x[w]];
- t[x[w]]^=1;
- }
- for(int i=0;i<v[w].size();i++)dfs(w,v[w][i]);
- if(op[w]==1){
- if(ans[w]!=ans[pre]){
- f[x[w]][y[w]]^=1;
- if(flag)s[x[w]]--;else s[x[w]]++;
- }
- }else if(op[w]==2){
- if(ans[w]!=ans[pre]){
- f[x[w]][y[w]]^=1;
- if(flag)s[x[w]]--;else s[x[w]]++;
- }
- }else if(op[w]==3){
- t[x[w]]^=1;
- }
- }
- int main(){
- scanf("%d%d%d",&n,&m,&q);
- for(int i=1;i<=q;i++){
- scanf("%d",&op[i]);
- if(op[i]==1){
- scanf("%d%d",x+i,y+i);
- v[last].push_back(id[i]=i);
- last=i;
- }else if(op[i]==2){
- scanf("%d%d",x+i,y+i);
- v[last].push_back(id[i]=i);
- last=i;
- }else if(op[i]==3){
- scanf("%d",x+i);
- v[last].push_back(id[i]=i);
- last=i;
- }else{
- scanf("%d",&k);
- last=id[i]=id[k];
- }
- }dfs(0,0);
- for(int i=1;i<=q;i++)printf("%d\n",ans[id[i]]);
- return 0;
- }
Codeforces 707D Persistent Bookcase(时间树)的更多相关文章
- 【离线】【深搜】【树】Codeforces 707D Persistent Bookcase
题目链接: http://codeforces.com/problemset/problem/707/D 题目大意: 一个N*M的书架,支持4种操作 1.把(x,y)变为有书. 2.把(x,y)变为没 ...
- CodeForces 707D Persistent Bookcase
$dfs$,优化. $return$操作说明该操作完成之后的状态和经过操作$k$之后的状态是一样的.因此我们可以建树,然后从根节点开始$dfs$一次(回溯的时候复原一下状态)就可以算出所有状态的答案. ...
- CodeForces 707D Persistent Bookcase ——(巧妙的dfs)
一个n*m的矩阵,有四种操作: 1.(i,j)处变1: 2.(i,j)处变0: 3.第i行的所有位置1,0反转: 4.回到第k次操作以后的状态: 问每次操作以后整个矩阵里面有多少个1. 其实不好处理的 ...
- Persistent Bookcase CodeForces - 707D (dfs 离线处理有根树模型的问题&&Bitset)
Persistent Bookcase CodeForces - 707D time limit per test 2 seconds memory limit per test 512 megaby ...
- codeforces 707D D. Persistent Bookcase(dfs)
题目链接: D. Persistent Bookcase time limit per test 2 seconds memory limit per test 512 megabytes input ...
- Codeforces Round #368 (Div. 2) D. Persistent Bookcase
Persistent Bookcase Problem Description: Recently in school Alina has learned what are the persisten ...
- CodeForces #368 div2 D Persistent Bookcase DFS
题目链接:D Persistent Bookcase 题意:有一个n*m的书架,开始是空的,现在有k种操作: 1 x y 这个位置如果没书,放书. 2 x y 这个位置如果有书,拿走. 3 x 反转这 ...
- 【Codeforces-707D】Persistent Bookcase DFS + 线段树
D. Persistent Bookcase Recently in school Alina has learned what are the persistent data structures: ...
- Codeforces Round #368 (Div. 2) D. Persistent Bookcase 离线 暴力
D. Persistent Bookcase 题目连接: http://www.codeforces.com/contest/707/problem/D Description Recently in ...
随机推荐
- java Timer 使用小结
Java自带的java.util.Timer类,通过调度一个java.util.TimerTask任务.这种方式可以让程序按照某一个频度执行,但不能指定时间运行.用的较少. 任务的调用通过起的子线程进 ...
- Sublime_调试PHP编译系统设置.
工具->编译系统->新建编译系统 { "cmd": ["C:\\wampserver\\bin\\php\\php5.3.13\\php.ex ...
- hdu 5755 Gambler Bo 高斯消元
题目链接 给n*m的方格, 每个格子有值{0, 1, 2}. 然后可以对格子进行操作, 如果选择了一个格子, 那么这个格子的值+2, 这个格子上下左右的格子+1, 并且模3. 问你将所有格子变成0的操 ...
- WinCmd
Q1:tracert Tracert (跟踪路由)是路由跟踪实用程序,用于确定 IP 数据报访问目标所采取的路径. Tracert 命令用 IP 生存时间 (TTL) 字段和 ICMP 错误消息来确定 ...
- Android 显示YUV编码格式
ByteArrayOutputStream out = new ByteArrayOutputStream(); String path = "res/drawable/sample.yuv ...
- 在非MVC环境下使用 Razor引擎
Razor引擎下载地址: http://github.com/Antaris/RazorEngine 解析Model: string template = "Hello @Model.Nam ...
- Google机器学习教程心得(一)
Hello world Google Machine Learning Recipes 1 官方中文博客 http://chinagdg.org/2016/03/machine-learning-re ...
- jenkins中Deploy to container Plugin插件发布配置
参数详解: 第一项(WAR/EAR files):是war包的相对路径(相对于工作区路径,即在工作区中war包的相对路径.)如我的maven执行完成之后会在工作区的target目录下生成项目.war, ...
- FLASH MAGIC LPC ISP下载方式说明
硬件:EASYARM2131 开发板软件:FLASH MAGIC 下载地址:http://www.flashmagictool.com/程序:Demo2131.hex LPC的ISP下载方式, ...
- CxImage的使用
1.首先从此处下载源代码 http://www.codeproject.com/KB/graphics/cximage.aspx 2.然后将里面的工程全部编译一下,我觉得应该是生成对应的库. 3.然后 ...