Codeforces 548B Mike and Fun
2 seconds
256 megabytes
standard input
standard output
Mike and some bears are playing a game just for fun. Mike is the judge. All bears except Mike are standing in an n × m grid, there's exactly one bear in each cell. We denote the bear standing in column number j of row number i by (i, j). Mike's hands are on his ears (since he's the judge) and each bear standing in the grid has hands either on his mouth or his eyes.

They play for q rounds. In each round, Mike chooses a bear (i, j) and tells him to change his state i. e. if his hands are on his mouth, then he'll put his hands on his eyes or he'll put his hands on his mouth otherwise. After that, Mike wants to know the score of the bears.
Score of the bears is the maximum over all rows of number of consecutive bears with hands on their eyes in that row.
Since bears are lazy, Mike asked you for help. For each round, tell him the score of these bears after changing the state of a bear selected in that round.
The first line of input contains three integers n, m and q (1 ≤ n, m ≤ 500 and 1 ≤ q ≤ 5000).
The next n lines contain the grid description. There are m integers separated by spaces in each line. Each of these numbers is either 0 (for mouth) or 1 (for eyes).
The next q lines contain the information about the rounds. Each of them contains two integers i and j(1 ≤ i ≤ n and 1 ≤ j ≤ m), the row number and the column number of the bear changing his state.
After each round, print the current score of the bears.
5 4 5
0 1 1 0
1 0 0 1
0 1 1 0
1 0 0 1
0 0 0 0
1 1
1 4
1 1
4 2
4 3
3
4
3
3
4
——————————————————————————————————————————————————————————————
本来挺简单的一道题,我却写得很复杂。不善于分析复杂度是硬伤啊!
———————————————————————————————————————————————————————————————
1. 读入复杂度N×M,这说明若果算法在与N×M相当的复杂度内是可以AC的
2. 对于一个长为L的01序列,可在O(L)时间内得到连续1的最大数目 (the maximum number of consecutive "1" s in it)。
int a[MAX_N];
int ans=, cur=;
for(int i=; i<=n; i++){
if(a[i]==){
cur++;
ans=max(ans, cur);
}
else cur=;
}
这个基本方法我却没想到,把简单问题搞得过于复杂,没怎么仔细考虑就决定用线段树维护,而且这线段树写得还很“丑陋”。
#include<bits/stdc++.h>
using namespace std;
const int MAX_N=;
//SegT_1
struct node{
int lb, rb;
int ma;
}T[MAX_N][MAX_N<<];
void renew(int i, int id){
node &now=T[i][id];
if(now.ma){
now.lb=now.rb=now.ma=;
}
else{
now.ma=now.lb=now.rb=;
}
}
void _renew(int i, int id, int L, int R){
node &fa=T[i][id], &ls=T[i][id<<], &rs=T[i][id<<|];
fa.lb=ls.lb==(R-L+)>>?ls.lb+rs.lb:ls.lb;
fa.rb=rs.rb==(R-L+)>>?rs.rb+ls.rb:rs.rb;
fa.ma=max(max(ls.ma, rs.ma), ls.rb+rs.lb);
}
void insert(int i, int id, int L, int R, int pos){
if(L==R){renew(i, id);return;}
int mid=(L+R)>>;
if(pos<=mid) insert(i, id<<, L, mid, pos);
else insert(i, id<<|, mid+, R, pos);
_renew(i, id, L, R);
}
//SegT_2
int mx[MAX_N<<];
void _insert(int id, int L, int R, int pos, int val){
if(L==R){mx[id]=val; return;}
int mid=(L+R)>>;
if(pos<=mid) _insert(id<<, L, mid, pos, val);
else _insert(id<<|, mid+, R, pos, val);
mx[id]=max(mx[id<<], mx[id<<|]);
}
//
int main(){
freopen("in", "r", stdin);
int N, M, Q;
cin>>N>>M>>Q;
int a;
for(int i=; i<=N; i++){
for(int j=; j<=M; j++)
if(cin>>a, a) insert(i, , , M, j);
_insert(, , N, i, T[i][].ma);
}
int i, j;
while(Q--){
cin>>i>>j;
insert(i, , , M, j);
_insert(, , N, i, T[i][].ma);
cout<<mx[]<<endl;
}
return ;
}
甚至于我还在想能不能在不牺牲时间复杂度的情况下将树状数组改造成支持单点改的RMQ(不想写两个线段树~<^>~),但我真是SB了。这题暴力的复杂度O(q(n+m)) (读入复杂度O(nm)相比之下可忽略了), 1e6的量级,1s完全可过了(况且都说Codeforces的机器快~)。
-----------------------------------------------------------------------------------------------------------------------
写复杂的原因呢,就是我不熟悉求一个01串内最长连续“1”的长度朴素的解法应该怎么写(怎么可以连这都不知道呢~),最终踏上了线段树的歧途。
(×&^伤#¥%), 最要紧的还是要把一些基础姿势get到。
Codeforces 548B Mike and Fun的更多相关文章
- CodeForces 548B Mike and Fun (模拟)
题意:给定一个n*m的矩阵,都是01矩阵,然后每次一个询问,改变一个格的值,然后问你最大有数是多少. 析:就是按他说的模拟,要预处理,只要把每行的最大值记下来,当改变时,再更新这一行的最大值. 代码如 ...
- hdu4135-Co-prime & Codeforces 547C Mike and Foam (容斥原理)
hdu4135 求[L,R]范围内与N互质的数的个数. 分别求[1,L]和[1,R]和n互质的个数,求差. 利用容斥原理求解. 二进制枚举每一种质数的组合,奇加偶减. #include <bit ...
- codeforces 547E Mike and Friends
codeforces 547E Mike and Friends 题意 题解 代码 #include<bits/stdc++.h> using namespace std; #define ...
- codeforces 689 Mike and Shortcuts(最短路)
codeforces 689 Mike and Shortcuts(最短路) 原题 任意两点的距离是序号差,那么相邻点之间建边即可,同时加上题目提供的边 跑一遍dijkstra可得1点到每个点的最短路 ...
- (CodeForces 548B 暴力) Mike and Fun
http://codeforces.com/problemset/problem/548/B Mike and some bears are playing a game just for fun. ...
- Codeforces 798D Mike and distribution - 贪心
Mike has always been thinking about the harshness of social inequality. He's so obsessed with it tha ...
- Codeforces 798C. Mike and gcd problem 模拟构造 数组gcd大于1
C. Mike and gcd problem time limit per test: 2 seconds memory limit per test: 256 megabytes input: s ...
- Codeforces 798A - Mike and palindrome
A. Mike and palindrome time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- Codeforces 689C. Mike and Chocolate Thieves 二分
C. Mike and Chocolate Thieves time limit per test:2 seconds memory limit per test:256 megabytes inpu ...
随机推荐
- JS框架之收集专帖
1.KNOCKOUT.JS 官网:http://knockoutjs.com/ 学习:http://www.cnblogs.com/TomXu/archive/2011/11/21/2257154.h ...
- 诺顿ghost备份恢复系统或分区
一 诺顿ghost简介 1,可以克隆分区 也可以克隆磁盘 2,克隆成img或磁盘内容对刻 3,磁盘分区--img---磁盘分区 磁盘---磁盘 二 操作步骤 对刻好的系统 整体思路: 1,A是模板 ...
- MySQL基础 - 注意事项
AND比OR优先级高,故在同时使用AND和OR进行查找时记得加上小括号,当同时存在多个条件时统一加上括号是个好习惯. NULL不参与搜索,即使使用LIKE '%'也匹配不到值为NULL的记录. LIK ...
- Listview实现不同类型的布局
打开各种客户端发现 Listview的布局多种多样,在我以前的认知中listview不是只能放一种item布局嘛,我就震惊了,现在我自己的项目上要用到这种方式那么就去做下 原理是listview 的a ...
- 20135202闫佳歆--week 8 进程的切换和系统的一般执行过程--学习笔记
此为个人笔记存档 week 8 进程的切换和系统的一般执行过程 一.进程调度与进程切换 1.不同的进程有不同的调度需求 第一种分类: I/O密集型(I/O-bound) 频繁的进行I/O 通常会花费很 ...
- Linux及安全期中总结
Chapter1 往期博客传送门 Linux内核分析——第一周学习笔记 Linux内核分析——第二周学习笔记 Linux内核分析——第三周学习笔记 <Linux内核设计与实现>学习记录一 ...
- 熟悉linux开发环境(实验)
北京电子科技学院(BESTI) 实验报告 课程: 深入理解计算机系统 班级: 1353班 姓名:张若嘉 杨舒雯 学号:20135330 20135324 成绩: 指导教师:娄嘉鹏 实验日期:2015. ...
- 问卷调查——答卷
1.你对自己的未来有什么规划?做了哪些准备?答:对未来的规划,就是像大多数人一样,在学校里有一个好的成绩,掌握扎实的专业基础,然后在国考上得到一个好成绩,得到一个好的工作机会,然后努力工作.目标很简单 ...
- 扫描二维码下载安装apk的app
将apk文件放到服务器上,下载链接直接生成二维码,用微信扫描时不能直接下载.页面只是刷新一下. 想实现微信扫描下载apk的app客户端,需要把下载链接做到一个网页上, 将网页生成一个二维码. 直接下载 ...
- CoffeeScript及相关文本标记语言
粗步看了下CoffeeScript(简称cs),发现cs这玩意还是有些问题,当然最大的问题之一是缺乏称手的工具.要是能放VS里编译调试当然好.但是转来转去的,真不如直接多敲几个JS字符串. 问题之二就 ...