【离线】【深搜】【树】Codeforces 707D Persistent Bookcase
来源:互联网 发布:淘宝客 知乎 编辑:程序博客网 时间:2024/05/21 05:37
题目链接:
http://codeforces.com/problemset/problem/707/D
题目大意:
一个N*M的书架,支持4种操作
1.把(x,y)变为有书。
2.把(x,y)变为没书。
3.把x行上的所有书状态改变,有变没,没变有。
4.回到第K个操作时的状态。
求每一次操作后书架上总共多少书。
题目思路:
【深搜】【树】
现场有一点思路不过没敢写哈。还是太弱了。
总共只用保存一张图,把操作看成一棵树,一开始I操作连接在I-1操作后,如果遇到操作4的话,把I操作与I-1操作的边断开,改为连接到K下。
这样把所有操作链完以后得到一棵多叉树,接下来深搜一遍,记录答案,回溯的时候把状态改回去即可。
////by coolxxx//#include<bits/stdc++.h>#include<iostream>#include<algorithm>#include<string>#include<iomanip>#include<map>#include<memory.h>#include<time.h>#include<stdio.h>#include<stdlib.h>#include<string.h>//#include<stdbool.h>#include<math.h>#define min(a,b) ((a)<(b)?(a):(b))#define max(a,b) ((a)>(b)?(a):(b))#define abs(a) ((a)>0?(a):(-(a)))#define lowbit(a) (a&(-a))#define sqr(a) ((a)*(a))#define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))#define mem(a,b) memset(a,b,sizeof(a))#define eps (1e-8)#define J 10#define mod 1000000007#define MAX 0x7f7f7f7f#define PI 3.14159265358979323#define N 1004#define M 100005using namespace std;typedef long long LL;int cas,cass;int n,m,lll,ans;struct xxx{int next,to,q,x,y;;}a[M];int last[M],an[M];bool mapp[N][N];void add(int x,int y){a[++lll].next=last[x];a[lll].to=y;last[x]=lll;}void dfs(int now,int sum){int i,j;an[now]=sum;for(i=last[now];i;i=a[i].next){if(a[i].q==1){if(mapp[a[i].x][a[i].y])dfs(a[i].to,sum);else{mapp[a[i].x][a[i].y]=1;dfs(a[i].to,sum+1);mapp[a[i].x][a[i].y]=0;}}else if(a[i].q==2){if(mapp[a[i].x][a[i].y]){mapp[a[i].x][a[i].y]=0;dfs(a[i].to,sum-1);mapp[a[i].x][a[i].y]=1;}else dfs(a[i].to,sum);}else if(a[i].q==3){int k=0;for(j=1;j<=m;j++){if(mapp[a[i].x][j])k--;else k++;mapp[a[i].x][j]^=1;}dfs(a[i].to,sum+k);for(j=1;j<=m;j++)mapp[a[i].x][j]^=1;}else if(a[i].q==4)dfs(a[i].to,sum);}}int main(){#ifndef ONLINE_JUDGE//freopen("1.txt","r",stdin);//freopen("2.txt","w",stdout);#endifint i,j,k;int x,y;//for(scanf("%d",&cas);cas;cas--)//for(scanf("%d",&cas),cass=1;cass<=cas;cass++)//while(~scanf("%s",s+1))while(~scanf("%d",&n)){//lll=0;mem(fa,0);mem(last,0);scanf("%d%d",&m,&cas);for(i=1;i<=cas;i++){scanf("%d",&a[i].q);if(a[i].q<3)scanf("%d%d",&a[i].x,&a[i].y);else if(a[i].q==3)scanf("%d",&a[i].x);else if(a[i].q==4){scanf("%d",&a[i].x);add(a[i].x,i);continue;}add(i-1,i);}dfs(0,0);for(i=1;i<=cas;i++)printf("%d\n",an[i]);puts("");}return 0;}/*////*/
0 0
- codeforces 707D Persistent Bookcase 离线+深搜
- 【离线】【深搜】【树】Codeforces 707D Persistent Bookcase
- codeforces 707D Persistent Bookcase
- CodeForces 707D - Persistent Bookcase
- codeforces--707D. Persistent Bookcase
- Codeforces 707D Persistent Bookcase(离线dfs或在线主席树)
- Codeforces 707D.Persistent Bookcase(离线算法,dfs树,好题!)
- [可持久化线段树] codeforces 707D. Persistent Bookcase
- Codeforces 707D Persistent Bookcase(DFS)
- 【21.28%】【codeforces 707D】Persistent Bookcase
- Codeforces 707D Persistent Bookcase 暴力(bitset)
- Codeforces Round #368 (Div. 2) D. Persistent Bookcase(离线)
- Codeforces Round #368 (Div. 2) D. Persistent Bookcase 离线 暴力
- Codeforces Round #368-D. Persistent Bookcase-(离线建树+暴力xjb搞)/(主席树在线乱搞)
- 树(Persistent Bookcase,cf 707d)
- Codeforces Problem 707D Persistent Bookcase(dfs+bitset)
- Codeforces 707D Persistent Bookcase(bitset+dfs)★
- codeforces 707 D Persistent Bookcase(dfs+bitset)
- Smarty模板技术-Smarty安装
- 面试题 java
- 数据按列排序
- Codeforces 707 C. Pythagorean Triples(找规律)——Codeforces Round #368 (Div. 2)
- codeforces 707D Persistent Bookcase
- 【离线】【深搜】【树】Codeforces 707D Persistent Bookcase
- strong和retain区别
- visual studio 的各个版本下载地址
- C# Task 用法
- 大唐电信java笔试题目
- mybatis扩展联合查询条件
- ubuntu 安装ssh
- 最短路之——寻找每两点之间最短路中的最长路
- java基础笔试题