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 ...
随机推荐
- brainfuck
/阅读这样的代码就像在强奸你的大脑 #include<stdio.h> #include<ctype.h> #include<stdlib.h> #include ...
- project和task
projects和tasks是Gradle中最重要的两个概念 任何一个Gradle构建狗屎一个或多个projects的组成.每个project包括许多可构建组成部分 什么是 project ? 一个j ...
- Node.js开发环境搭建
1.安装express npm install express -g 2.express33.6以后把express-generator分离出来了,所以还需安装express-generator,否则 ...
- jquery 现实多状态控件 (status & power(2,0)) = power(2,0)
数据库表设计的时候,会有很些多状态的需求,比如招聘职位需要同时发布到武汉,广州,上海 实现方法有很多种,我选择了在职位表中建一个 int 型字段保存多种状态,这个涉及到一些算法,我要查询武汉和广州的职 ...
- 【快报】基于K2 BPM的新一代协同办公门户实践交流会
2014年2月28日,“基于BPM的新一代协同办公门户”用户实践交流活动在深圳金茂JW万豪酒店3楼Meet Room IV举办.本次会议由K2携手微软共同举办,邀请到的参会企业都是K2 的BPM老客户 ...
- High Performance Animations
http://www.html5rocks.com/zh/tutorials/speed/high-performance-animations/
- How to install 64-bit Google Chrome 28+ on 64-bit RHEL/CentOS 6 or 7
How to install 64-bit Google Chrome 28+ on 64-bit RHEL/CentOS 6 or 7 The problem Google developers s ...
- php基础23:数值与数值函数
<?php //1.自动转换 $a = 5; $b = "5a"; $c = $a + $b; echo $c; echo "<br>"; $ ...
- xp-win7-win8的基础到精通教程-系统优化减肥教程-windos装mac
是否还在使用别人封装的系统?是否还在担心下载后的系统是有病毒的?还在为 安装好新系统后,里面安装的软件全是自己不需要的?担心流氓软件绑定浏览器主页?担心 系统重装后,自己所有的编程软件都需要重新安装? ...
- UIPasteboard的使用
剪贴板的使用以及自定义剪贴板. 系统剪贴板的直接调用 其实整个过程非常的简单,我就用我写的一个自定义UILable来说明调用系统剪贴板. 首先,因为苹果只放出来了 UITextView,UITextF ...