【离线】【深搜】【树】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
原创粉丝点击