CF# 368 D2 D
很容易想到可以它操作序列弄成有向图,果断深搜。但我开始竟然用了一种特醇的方法,每个书架做一次深搜,复杂度O(nq),跑到57个test就不动了。看看代码吧
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
//#include <bitset>
using namespace std; const int MAXOPT = 100005; struct OPT{
int opt, r, c;
}op[MAXOPT]; struct bits{
char s[125];
void init(){
for(int i = 0; i < 125; i++) s[i] = 0;
}
bool find(int k){
int p = k / 8;
int m = k % 8;
if(s[p] & (1<<m)) return true;
return false;
} void set(int k){
int p = k / 8;
int m = k % 8;
s[p] |= (1<<m);
} void reset(int k){
int p = k / 8;
int m = k % 8;
s[p] ^= (1<<m);
} void flip(){
for(int i = 0; i < 125; i++){
s[i] ^= (-1);
}
}
}; struct STATE{
bits st;
void init(){
st.init();
counts = 0;
}
int counts;
}; vector<int>nt[MAXOPT]; int ans[MAXOPT];
int n, m, q; void dfs(int pos, STATE iter, int sh){
int sz = nt[pos].size();
for(int k = 0; k < sz; k++){
ans[nt[pos][k]] += iter.counts;
dfs(nt[pos][k], iter, sh);
} while(op[pos + 1].opt != 4 && pos < q){
pos ++;
if(op[pos].r == sh){
if(op[pos].opt == 1){
if(!iter.st.find(op[pos].c - 1)){
iter.counts++;
iter.st.set(op[pos].c - 1);
}
}
else if(op[pos].opt == 2){
if(iter.st.find(op[pos].c - 1)){
iter.counts --;
iter.st.reset(op[pos].c - 1);
}
}
else {
iter.st.flip();
iter.counts = m - iter.counts;
}
}
ans[pos] += iter.counts;
int sz = nt[pos].size();
for(int k = 0; k < sz; k++){
ans[nt[pos][k]] += iter.counts;
dfs(nt[pos][k], iter, sh);
}
} } int main(){
int opt, r, c;
memset(ans, 0, sizeof(ans));
scanf("%d%d%d", &n, &m, &q);
for(int i = 0; i <= q; i++)
nt[i].clear(); for(int i = 1; i <= q; i++){
scanf("%d", &op[i].opt);
if(op[i].opt == 1 || op[i].opt == 2){
scanf("%d%d", &op[i].r, &op[i].c);
}
else {
scanf("%d", &op[i].r);
}
if(op[i].opt == 4){
nt[op[i].r].push_back(i);
}
}
for(int i = 1; i <= n; i++){
STATE iter;
iter.init();
ans[0] += iter.counts;
dfs(0, iter, i);
} for(int i = 1; i <= q; i++){
printf("%d\n", ans[i]);
} return 0;
}
后来想到,一次操作只动一个书架,深搜之后把原来的状态还原回去就可以啦,复杂度O(q)。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
//#include <bitset>
using namespace std; const int MAXOPT = 100005; int state[1005][1005]; int n, m, q; struct operation{
int op, r, c;
}op[MAXOPT];
int ans[MAXOPT];
vector<int> nt[MAXOPT]; void dfs(int u){
int sz = nt[u].size();
for(int i = 0; i < sz; i++){
int v = nt[u][i];
if(op[v].op == 1){
int pre = state[op[v].r][op[v].c];
if(!pre){
state[op[v].r][op[v].c] = 1;
ans[v] = ans[u] + 1;
}
else ans[v] = ans[u];
dfs(v);
state[op[v].r][op[v].c] = pre;
}
else if(op[v].op == 2){
int pre = state[op[v].r][op[v].c];
if(pre){
state[op[v].r][op[v].c] = 0;
ans[v] = ans[u] - 1;
}
else ans[v] = ans[u];
dfs(v);
state[op[v].r][op[v].c] = pre;
}
else if(op[v].op == 3){
int c = 0;
for(int k = 1; k <=m; k++){
if(state[op[v].r][k]) c++;
state[op[v].r][k] ^= 1;
}
ans[v] = ans[u] - c + m - c;
dfs(v); for(int k = 1; k <=m; k++){
state[op[v].r][k] ^= 1;
} }
else{
ans[v] = ans[u];
dfs(v);
}
}
} int main(){ scanf("%d%d%d", &n, &m, &q);
memset(ans, 0, sizeof(ans));
memset(state, 0, sizeof(state));
for(int i = 1; i <= q; i++){
scanf("%d", &op[i].op);
if(op[i].op == 1 || op[i].op == 2){
scanf("%d%d", &op[i].r, &op[i].c);
}
else{
scanf("%d", &op[i].r);
}
if(op[i].op == 4) nt[op[i].r].push_back(i);
else nt[i - 1].push_back(i);
} dfs(0); for(int i = 1; i <= q; i++)
printf("%d\n", ans[i]); return 0;
}
CF# 368 D2 D的更多相关文章
- CF#310 d2
A:|c[1]-c[0]| B:A+-(oc)A[0]==0..n-1 C: #include <cstdio> int n,m,i,j,k,p; int ll,ca,cb,cc; int ...
- CF #368 div2
题目链接:http://codeforces.com/contest/707/problem/A A. Brain's Photos time limit per test 2 seconds mem ...
- CF # 369 D2 D、E
D,只要抓住每个点只有一个出度,那么图就能分成几个部分,而且可以发现,一个部分最多一个环. #include <iostream> #include <cstdio> #inc ...
- CF #330 D2 E
相当于给你一些点,要你最多删除不超过k,使得能使用一个边长为整数的长方形,与XY轴平行,使长方形的面积最小. 上课时拿笔来画画,然后忽然思路就开了,要是比赛也这样就好了~~先按X,Y分别排序,由于K较 ...
- NSCharacterSet 使用说明
NSCharacterSet 和 NSMutableCharacterSet 用面向对象的方式来表示一组Unicode字符,它经常与NSString及NSScanner组合起来使用,在不同的字符上 ...
- ssl
在Java加密技术(八)中,我们模拟了一个基于RSA非对称加密网络的安全通信.现在我们深度了解一下现有的安全网络通信--SSL. 我们需要构建一个由CA机构签发的有效证书,这里我们使用上文中生 ...
- Visual Studio 2015的坑:中文字符串编译后成乱码
(2015年8月5日更新:微软已经修复了Roslyn的这个bug,详见 https://github.com/dotnet/roslyn/pull/4303 ) 昨天,我们用VS2015编译了博客程序 ...
- MIM协议与Base64编码
MIME Protocol 1. MIME的全称是"Multipurpose Internet Mail Extensions",中译为"多用途互联网邮件扩展" ...
- [Codeforces Round #296 div2 D] Clique Problem 【线段树+DP】
题目链接:CF - R296 - d2 - D 题目大意 一个特殊的图,一些数轴上的点,每个点有一个坐标 X,有一个权值 W,两点 (i, j) 之间有边当且仅当 |Xi - Xj| >= Wi ...
随机推荐
- (转)SpringMVC学习(十一)——SpringMVC实现Resultful服务
http://blog.csdn.net/yerenyuan_pku/article/details/72514034 Restful就是一个资源定位及资源操作的风格,不是标准也不是协议,只是一种风格 ...
- Discuz 页面不能加载插件的原因和解决方法
模板中,<!--{subtemplate common/headerF}-->这样就不能加载 source/class/class_template.php里65行附近代码 $header ...
- C#根據當前DataGridView查詢數據導出Excel
private void btnsuggestinfo_Click(object sender, EventArgs e) { DataTable dt = new DataTable(); dt.C ...
- CAD参数绘制椭圆(com接口)
在CAD设计时,需要绘制椭圆,用户可以设置椭圆的基本属性. 主要用到函数说明: _DMxDrawX::DrawEllipse 绘制椭圆.详细说明如下: 参数 说明 DOUBLE dCenterX 椭圆 ...
- CAD参数绘制圆(网页版)
CAD绘制图像的过程中,画圆的情况是非常常见的,用户可以设置圆的圆心位置及半径属性. 主要用到函数说明: _DMxDrawX::DrawCircle 绘制一个圆.详细说明如下: 参数 说明 DOUBL ...
- ipv6工具类
package mapreduce.nat; import java.math.BigDecimal; import java.math.BigInteger; import java.net.Ine ...
- webstorm 设置ES6语法支持以及添加vuejs开发配置
参考文章:https://blog.csdn.net/diligentkong/article/details/75040651
- Google Chrome浏览器调试
作为Web开发人员,我为什么喜欢Google Chrome浏览器 [原文地址:http://www.cnblogs.com/QLeelulu/archive/2011/08/28/2156402.ht ...
- JFinal项目eclipse出现Unknown column 'createtime' in 'order clause' 的错误
JFinal项目eclipse出现Unknown column 'createtime' in 'order clause' 的错误,在本次项目中的原因是我的表中的字段信息中创建时间的字段是creat ...
- vue-cli项目中使用mockjs(基础使用和全局配置使用)
参考:vue+mockjs 模拟数据,实现前后端分离开发 (Github-Demo可查看全部代码),Mockjs ,Axios 很多时候前后端分离的项目在开发过程中前端所需数据和后端接口并不会同步开发 ...