cf707D. Persistent Bookcase(离线+dfs)
题目链接:http://codeforces.com/problemset/problem/707/D
有一个n*m的书架,有K个操作,求每个操作后一共有多少本书;有4种操作;
1:x y 如果 x y 位置没有书,放一本书在上面;
2:x y如果 x y 位置有书,移走;
3:x,表示把第x行的所有又书的拿走,没书的放上去;
4:k,回到第k个操作后的状态;
离线处理k个操作;当操作不为 4 时,把操作i连在i-1后,=4时把操作 i 连在a[i].x后;
这样建一棵树,然后遍历即可,在回溯的时候注意更改书架的状态即可;
#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdio.h>
#include<math.h>
#include<vector>
using namespace std;
#define N 1005
#define PI 4*atan(1.0)
#define mod 1000000007
#define met(a, b) memset(a, b, sizeof(a))
typedef long long LL; struct node
{
int op, x, y, ans;
}a[N*N];///k个操作; int cnt[N][N];///记录书架的状态;
int n, m, k;
vector<vector<int> > G;///操作形成的图; void dfs(int u)
{
if(a[u].op == )
{
int flag = ;
if(cnt[a[u].x][a[u].y] == )
{
flag = ;
a[u].ans ++;///在已有的基础上加上更改的值;
cnt[a[u].x][a[u].y] = ;///标记状态;
}
for(int i=, len=G[u].size(); i<len; i++)
{
int v = G[u][i];
a[v].ans = a[u].ans;///往下走的时候,v是u的儿子,所以拥有u的ans;
dfs(v);
}
if(flag)///回溯时要重新更改状态;
cnt[a[u].x][a[u].y] = ;
}
else if(a[u].op == )
{
int flag = ;
if(cnt[a[u].x][a[u].y] == )
{
flag = ;
a[u].ans --;
cnt[a[u].x][a[u].y] = ;
}
for(int i=, len=G[u].size(); i<len; i++)
{
int v = G[u][i];
a[v].ans = a[u].ans;
dfs(v);
}
if(flag)
cnt[a[u].x][a[u].y] = ;
}
else if(a[u].op == )
{
int num = ;
for(int i=; i<=m; i++)
{
if(cnt[a[u].x][i] == )
num ++;
cnt[a[u].x][i] ^= ;
}
a[u].ans = a[u].ans - num + (m-num);///更新ans;
for(int i=, len=G[u].size(); i<len; i++)
{
int v = G[u][i];
a[v].ans = a[u].ans;
dfs(v);
}
for(int i=; i<=m; i++)
cnt[a[u].x][i] ^= ;
}
else
{
for(int i=, len=G[u].size(); i<len; i++)
{
int v = G[u][i];
a[v].ans = a[u].ans;
dfs(v);
}
}
} int main()
{
while(scanf("%d %d %d", &n, &m, &k)!=EOF)
{
met(a, );
met(cnt, );
G.clear();
G.resize(k+); for(int i=; i<=k; i++)
{
scanf("%d", &a[i].op);
if(a[i].op <= )
scanf("%d %d", &a[i].x, &a[i].y);
else
scanf("%d", &a[i].x); if(a[i].op <= )
G[i-].push_back(i);
else
G[a[i].x].push_back(i);
} for(int i=, len=G[].size(); i<len; i++)
dfs(G[][i]); for(int i=; i<=k; i++)
printf("%d\n", a[i].ans);
}
return ;
}
cf707D. Persistent Bookcase(离线+dfs)的更多相关文章
- CF707D Persistent Bookcase
CF707D Persistent Bookcase 洛谷评测传送门 题目描述 Recently in school Alina has learned what are the persistent ...
- Codeforces Round #368 (Div. 2) D. Persistent Bookcase 离线 暴力
D. Persistent Bookcase 题目连接: http://www.codeforces.com/contest/707/problem/D Description Recently in ...
- CF707D Persistent Bookcase 可持久化线段树
维护一个二维零一矩阵(n,m<=1000),支持四种操作(不超过10^5次): 将(i,j)置一 将(i,j)置零 将第i行零一反转yu 回到第K次操作前的状态 每次操作后输出全局一共有多少个一 ...
- Persistent Bookcase CodeForces - 707D (dfs 离线处理有根树模型的问题&&Bitset)
Persistent Bookcase CodeForces - 707D time limit per test 2 seconds memory limit per test 512 megaby ...
- CodeForces #368 div2 D Persistent Bookcase DFS
题目链接:D Persistent Bookcase 题意:有一个n*m的书架,开始是空的,现在有k种操作: 1 x y 这个位置如果没书,放书. 2 x y 这个位置如果有书,拿走. 3 x 反转这 ...
- 【Codeforces-707D】Persistent Bookcase DFS + 线段树
D. Persistent Bookcase Recently in school Alina has learned what are the persistent data structures: ...
- codeforces 707D D. Persistent Bookcase(dfs)
题目链接: D. Persistent Bookcase time limit per test 2 seconds memory limit per test 512 megabytes input ...
- Codeforces Round #368 (Div. 2) D. Persistent Bookcase
Persistent Bookcase Problem Description: Recently in school Alina has learned what are the persisten ...
- 离线dfs CF div2 707 D
http://codeforces.com/contest/707/problem/D 先说一下离线和在线:在线的意思就是每一个询问单独处理复杂度O(多少多少),离线是指将所有的可能的询问先一次都处理 ...
随机推荐
- HDU1667 : The Rotation Game
考虑枚举最后中间的数字,然后可以用一个24位的整数来表示一个状态,一共有C(24,8)=735471种状态,然后BFS即可. 比赛的时候由于手速问题没写完TAT 写完后在坑爹评测机上还是TLE. 所以 ...
- 【POJ】2954 Triangle(pick定理)
http://poj.org/problem?id=2954 表示我交了20+次... 为什么呢?因为多组数据我是这样判断的:da=sum{a[i].x+a[i].y},然后!da就表示没有数据了QA ...
- USACO 5.4 Character Recognition(DP)
非常恶心的一题,卡了三个月,没什么动力做了,代码直接抄的别人的... 这题主要思路就是预处理出几个数组,再预处理出几个数组,最后DP,输出一下路径... 写起来挺非常麻烦,代码不贴了,丢人... 把U ...
- BZOJ3444: 最后的晚餐
Description [问题背景] 高三的学长们就要离开学校,各奔东西了.某班n人在举行最后的离别晚餐时,饭店老板觉得十分纠结.因为有m名学生偷偷找他,要求和自己暗恋的同学坐在一起. [问题描述] ...
- iOS开发中使用[[UIApplication sharedApplication] openURL:]加载其它应用
iOS 应用程序之间(1) 在iOS开发中,经常需要调用其它App,如拨打电话.发送邮件等.UIApplication:openURL:方法是实现这一目的的最简单方法,该方法一般通过提供的u ...
- 提取数据用strpos函数比较,预期和实际不符问题解决
在我提取数据时,数据是一串字符串,第一个数据和要比较的字符是相等的可是却是相反的结果 . 测试if(0==false)结果如图 执行结果 说明0和false相等.我的程序开始是这样的 第一个数据是正确 ...
- MS10048依旧是Windows 2003 x86 的杀器
今天搞了个wow的游戏论坛,服务器环境是win03 x86+iis6.0+php+mysql. 提权的时候各种无奈,mysql无权限,而且没root,试了几个别的方法都不行,实在没办法的时候,用MS1 ...
- for循环的时候是按照数字递增会造成一些元素被遗漏
$test_array=array(1,2,3,4,4,5,5,6); $test_array_unique=array_unique($test_array); print_r($test_arra ...
- QQ、淘宝、阿里旺旺在线网页链接代码及详解 很实用
你可直接到官网去生成代码,简单.方便,相信都能上网的你,对这不会有难度的,认识字的就行,赶紧去吧! 1.阿里旺旺官网: http://page.1688.com/html/wangwang/dow ...
- discuz ucenter通信失败
一般出现时2个问题,一个是目录出问题,改成你现在的目录就行 二个就是通信密钥不对,应该和config文件下的config_ucenter.php文件里的UC_KEY一致