Codeforces Round #368 (Div. 2) D Persistent Bookcase(离线+DFS)
来源:互联网 发布:php运费模板源码 编辑:程序博客网 时间:2024/06/06 07:15
思路:离线把所有操作都存起来,并且对于前三个操作连i-1到i的边,第四个操作回到第K个结点那么连k到i的边,然后DFS记录变化就可以了,这个过程对于第一次接触可能不太好理解,可以结合代码看
注意:加书本的时候如果本来就有的话这个操作相当于无效,同理对于去掉一本书,DFS的时候回溯的时候记得把原来标记的状态变回原来的
#include<bits/stdc++.h>using namespace std;const int maxn =1005;const int maxq = 1e5+7;int a[maxn][maxn],ans[maxq],op[maxq];pair<int,int>op1[maxq];vector<int>e[maxq];int sum = 0;int n,m,q;void dfs(int x){if(op[x]!=4) ans[x]=sum;elsesum=ans[x];int nn,mm;for(int i = 0;i<e[x].size();i++){int v = e[x][i];if(op[v]==1){int op1flag=0; if(a[op1[v].first][op1[v].second]==0){ a[op1[v].first][op1[v].second]=1; sum++;op1flag = 1;}nn = op1[v].first;mm = op1[v].second;dfs(v); if(op1flag) a[nn][mm]=0,sum--;}if(op[v]==2){int op2flag = 0;if(a[op1[v].first][op1[v].second]==1) a[op1[v].first][op1[v].second]=0,sum--,op2flag=1;nn=op1[v].first,mm=op1[v].second;dfs(v); if(op2flag) a[nn][mm]=1,sum++;}if(op[v]==3){nn = op1[v].first;for(int j = 1;j<=m;j++){if(a[nn][j]){a[nn][j]=0;sum--;}else{a[nn][j]=1;sum++;}}dfs(v); for(int j = 1;j<=m;j++) { if(a[nn][j]) { a[nn][j]=0; sum++; } else { a[nn][j]=1; sum--; } } }if(op[v]==4){ans[v]=ans[op1[v].first];dfs(v);}}}int main(){ scanf("%d%d%d",&n,&m,&q); for(int i = 1;i<=q;i++) { scanf("%d",&op[i]); if(op[i]==1) { int nn,mm; scanf("%d%d",&nn,&mm); op1[i]=make_pair(nn,mm); e[i-1].push_back(i); } if(op[i]==2) { int nn,mm; scanf("%d%d",&nn,&mm); op1[i]=make_pair(nn,mm); e[i-1].push_back(i); } if(op[i]==3) { int nn; scanf("%d",&nn); op1[i]=make_pair(nn,-1); e[i-1].push_back(i); } if(op[i]==4) { int k; scanf("%d",&k); e[k].push_back(i); op1[i] = make_pair(k,-1); } } dfs(0); for(int i = 1;i<=q;i++) printf("%d\n",ans[i]);}
0 0
- Codeforces Round #368 (Div. 2) D. Persistent Bookcase(离线)
- Codeforces Round #368 (Div. 2) D. Persistent Bookcase(dfs)
- Codeforces Round #368 (Div. 2) D. Persistent Bookcase (离线+dfs)
- Codeforces Round #368 (Div. 2) D Persistent Bookcase(离线+DFS)
- Codeforces Round #368 (Div. 2) D. Persistent Bookcase 离线 暴力
- Codeforces Round #368 (Div. 2) D. Persistent Bookcase 离线 dfs+bitset
- Codeforces Round #368 (Div. 2)(D. Persistent Bookcase 离线 转化DAG)
- Codeforces Round #368 (Div. 2) D. Persistent Bookcase (离线算法+lazy标记优化)
- Codeforces Round #368 (Div. 2)D Persistent Bookcase
- Codeforces Round #368 (Div. 2) [D] Persistent Bookcase
- Codeforces Round #368 (Div. 2) D - Persistent Bookcase
- Codeforces Round #368 (Div. 2) D. Persistent Bookcase(可持久化)
- Codeforces 707D Persistent Bookcase(DFS)
- Codeforces Round #368 (Div. 2) D. Persistent Bookcase【可持久化线段树,区间取反
- Codeforces 707D.Persistent Bookcase(离线算法,dfs树,好题!)
- Codeforces Round #368-D. Persistent Bookcase-(离线建树+暴力xjb搞)/(主席树在线乱搞)
- Codeforces Round #368 (Div. 2) D. Persistent Bookcase(n层m个的书架的四种操作)
- codeforces 707D Persistent Bookcase 离线+深搜
- LruCache源码解析
- SPOJ COT(树上k大,主席树+LCA)
- FFmpeg音视频同步的问题
- 93.leetcode Restore IP Addresses(medium)[回溯 DFS]
- MySQL for mac 连接报错:Access denied for user 'root'@'localhost' (using password: YES)
- Codeforces Round #368 (Div. 2) D Persistent Bookcase(离线+DFS)
- [2-sat]模型基础(poj3678)
- Day0823_将音乐库中的音乐在Service中异步加载, 播放音乐并设置到通知栏
- pycharm设置
- Linux USB Driver
- UVaLive 6697 (DP)
- Eclipse中写Spark代码
- AngularJS 发送POST请求到后台
- java实现简单排序算法:归并排序