Codeforces Round #368 (Div. 2)(D. Persistent Bookcase 离线 转化DAG)

2024-08-30 20:08

本文主要是介绍Codeforces Round #368 (Div. 2)(D. Persistent Bookcase 离线 转化DAG),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接

给出n*m的书架,4种操作
1,x,y,如果(x,y)空,该位置则放一本书
2,x,y,如果(x,y)不空,该位置拿走一本书
3,x, 把这一层有书的拿出,没书的放上书,即反转
4,x, 返回到第x操作后的书架的状态

初始书架是空的,要注意一点的是,题目可能在没书的地方拿书,有书的地方放书,明显这样的操作是不成功的,没影响的,所以要标记一下。

麻烦的是第4操作,无法记录每次操作的状态,直接暴力也会超时,可以这样考虑:
第k步操作的结果,一般是由第k-1步操作的结果加上第k步的操作转化而来,但是当第k步是操作4的时候,那么第k步就还可以从第x步操作转化而来,所以我们以此建立DAG,进行dfs,回溯的时候取消操作,在继续遍历其他的儿子。巧妙!

#include<bits/stdc++.h>
using namespace std;
#define cl(a,b) memset(a,b,sizeof(a))
#define fastIO ios::sync_with_stdio(false);cin.tie(0);
#define LL long long
#define pb push_back
#define gcd __gcd#define For(i,j,k) for(int i=(j);i<k;i++)
#define lowbit(i) (i&(-i))
#define _(x) printf("%d\n",x)const int maxn = 1e5+10;
const int inf  = 1 << 28;int n,m,q;struct node{int type,x,y,ok,ans;
}Q[maxn];vector<int> G[maxn];
bitset<1005> bit[1005],all;
int total;void todo(int i){if(Q[i].type==1){total -= bit[Q[i].x].count();if(!bit[Q[i].x][Q[i].y])Q[i].ok=true,bit[Q[i].x][Q[i].y]=1;total += bit[Q[i].x].count();}if(Q[i].type==2){total -= bit[Q[i].x].count();if(bit[Q[i].x][Q[i].y]) Q[i].ok=true,bit[Q[i].x][Q[i].y]=0;total += bit[Q[i].x].count();}if(Q[i].type==3){total -= bit[Q[i].x].count();bit[Q[i].x]^=all;total += bit[Q[i].x].count();}
}void undo(int i){if(Q[i].type==1){total -= bit[Q[i].x].count();if(Q[i].ok)bit[Q[i].x][Q[i].y] = 0;total += bit[Q[i].x].count();}if(Q[i].type==2){total -= bit[Q[i].x].count();if(Q[i].ok)bit[Q[i].x][Q[i].y] = 1;total += bit[Q[i].x].count();}if(Q[i].type==3){total -= bit[Q[i].x].count();bit[Q[i].x]^=all;total += bit[Q[i].x].count();}
}void dfs(int x){todo(x);Q[x].ans = total;for(int i=0;i<G[x].size();i++)dfs(G[x][i]);undo(x);
}int main(){scanf("%d%d%d",&n,&m,&q);for(int i=1;i<=q;i++){scanf("%d%d",&Q[i].type,&Q[i].x);if(Q[i].type<=2)scanf("%d",&Q[i].y);if(Q[i].type==4){G[Q[i].x].pb(i);}else {G[i-1].pb(i);}}for(int i=1;i<=m;i++)all[i]=1;dfs(0);for(int i=1;i<=q;i++){printf("%d\n",Q[i].ans);}return 0;
}

这篇关于Codeforces Round #368 (Div. 2)(D. Persistent Bookcase 离线 转化DAG)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1121808

相关文章

usaco 1.2 Palindromic Squares(进制转化)

考察进制转化 注意一些细节就可以了 直接上代码: /*ID: who jayLANG: C++TASK: palsquare*/#include<stdio.h>int x[20],xlen,y[20],ylen,B;void change(int n){int m;m=n;xlen=0;while(m){x[++xlen]=m%B;m/=B;}m=n*n;ylen=0;whi

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

Codeforces Round #261 (Div. 2)小记

A  XX注意最后输出满足条件,我也不知道为什么写的这么长。 #define X first#define Y secondvector<pair<int , int> > a ;int can(pair<int , int> c){return -1000 <= c.X && c.X <= 1000&& -1000 <= c.Y && c.Y <= 1000 ;}int m

Codeforces Beta Round #47 C凸包 (最终写法)

题意慢慢看。 typedef long long LL ;int cmp(double x){if(fabs(x) < 1e-8) return 0 ;return x > 0 ? 1 : -1 ;}struct point{double x , y ;point(){}point(double _x , double _y):x(_x) , y(_y){}point op

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

Codeforces 482B 线段树

求是否存在这样的n个数; m次操作,每次操作就是三个数 l ,r,val          a[l] & a[l+1] &......&a[r] = val 就是区间l---r上的与的值为val 。 也就是意味着区间[L , R] 每个数要执行 | val 操作  最后判断  a[l] & a[l+1] &......&a[r] 是否= val import ja

CSS实现DIV三角形

本文内容收集来自网络 #triangle-up {width: 0;height: 0;border-left: 50px solid transparent;border-right: 50px solid transparent;border-bottom: 100px solid red;} #triangle-down {width: 0;height: 0;bor

全英文地图/天地图和谷歌瓦片地图杂交/设备分布和轨迹回放/无需翻墙离线使用

一、前言说明 随着风云局势的剧烈变化,对我们搞软件开发的人员来说,影响也是越发明显,比如之前对美对欧的软件居多,现在慢慢的变成了对大鹅和中东以及非洲的居多,这两年明显问有没有俄语或者阿拉伯语的输入法的增多,这要是放在2019年以前,一年也遇不到一个人问这种需求场景的。 地图应用这块也是,之前的应用主要在国内,现在慢慢的多了一些外国的应用场景,这就遇到一个大问题,我们平时主要开发用的都是国内的地

5.1声道转化为左右声道

5.1声道转化为左右声道downmix http://szfzafa.blog.163.com/blog/static/11895416720120724729214/ 标题: Downmix 5.1ch to 2ch in AVS   最简单: function Dmix6Stereo(clip a) {  # 6 Channels L,R,C,LFE,SL,SR   f