题链:

http://codeforces.com/problemset/problem/480/E
题解:

单调队列,逆向思维
(在线的话应该是分治做,但是好麻烦。。)
离线操作,逆向考虑,
最后的状态可以用O(N*M)的dp得出最大正方形边长。
然后反向一个一个的把障碍变回非障碍,显然答案不会变小。
维护好up[i][j],down[i][j],分别表示从(i,j)位置向上向下有多长的连续非障碍。
不难发现,如果有更大的答案的话,那么必然包含当前改变的位置的那一行的某些格子。
所以确定了在这一行上寻找是否有更大的答案,
然后就用单调队列维护来求出当前行上的最大正方形即可。

代码:

#include<bits/stdc++.h>
#define MAXN 2005
using namespace std;
struct CMD{int x,y,ans;}C[MAXN];
bool graph[MAXN][MAXN];
int up[MAXN][MAXN],down[MAXN][MAXN];
int N,M,K,ANS;
void update(int j){
for(int i=1;i<=N;i++)
up[i][j]=graph[i][j]?up[i-1][j]+1:0;
for(int i=N;i>=1;i--)
down[i][j]=graph[i][j]?down[i+1][j]+1:0;
}
void prework(){
static int dp[MAXN][MAXN];
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++){
if(graph[i][j]==0) dp[i][j]=0;
else dp[i][j]=min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]))+1;
ANS=max(ANS,dp[i][j]);
}
for(int j=1;j<=M;j++) update(j);
}
int main(){
char ch;
scanf("%d%d%d",&N,&M,&K);
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++)
scanf(" %c",&ch),graph[i][j]=ch=='.'?1:0;
for(int i=1;i<=K;i++)
scanf("%d%d",&C[i].x,&C[i].y),graph[C[i].x][C[i].y]=0;
prework(); C[K].ans=ANS;
static int ql[MAXN],qr[MAXN],qll,qlr,qrl,qrr;
for(int i=K,ret,x,l,r,h;i>=1;i--){
ret=0; x=C[i].x;
graph[C[i].x][C[i].y]=1;
update(C[i].y);
qll=qrl=l=1; qlr=qrr=r=0;
while(l<=M){
h=-233;
if(l<=r){
h=up[x][ql[qll]]+down[x][qr[qrl]]-1;
ret=max(ret,min(h,r-l+1));
}
if(r<M&&(h==-233||h>=r-l+1)){
r++;
while(qll<=qlr&&up[x][ql[qlr]]>=up[x][r]) qlr--; ql[++qlr]=r;
while(qrl<=qrr&&down[x][qr[qrr]]>=down[x][r]) qrr--;qr[++qrr]=r;
}
else{
l++;
while(qll<=qlr&&ql[qll]<l) qll++;
while(qrl<=qrr&&qr[qrl]<l) qrl++;
}
}
ANS=max(ret,ANS);
C[i-1].ans=ANS;
}
for(int i=1;i<=K;i++) printf("%d\n",C[i].ans);
return 0;
}

  

●CodeForces 480E Parking Lot的更多相关文章

  1. Parking Lot CodeForces - 480E

    大意: 给定01矩阵, 单点赋值为1, 求最大全0正方形. 将询问倒序处理, 那么答案一定是递增的, 最多增长$O(n)$次, 对于每次操作暴力判断答案是否增长即可, 也就是说转化为判断是否存在一个边 ...

  2. Codeforces 46D Parking Lot

    传送门 D. Parking Lot time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  3. Codeforces 219E Parking Lot 线段树

    Parking Lot 线段树区间合并一下, 求当前要占的位置, 不包括两端点的写起来方便一点. #include<bits/stdc++.h> #define LL long long ...

  4. CF数据结构练习

    1. CF 438D The Child and Sequence 大意: n元素序列, m个操作: 1,询问区间和. 2,区间对m取模. 3,单点修改 维护最大值, 取模时暴力对所有>m的数取 ...

  5. Codeforces Round #135 (Div. 2) E. Parking Lot 线段数区间合并

    E. Parking Lot time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  6. Codeforces 480.E Parking Lot

    E. Parking Lot time limit per test 3 seconds memory limit per test 256 megabytes input standard inpu ...

  7. Codeforces Parking Lot

    http://codeforces.com/problemset/problem/630/I 简单的排列组合,推式子技巧:举一个小样例,看着推,别抽象着推,容易错 #include <iostr ...

  8. Codeforces Round#415 Div.2

    A. Straight «A» 题面 Noora is a student of one famous high school. It's her final year in school - she ...

  9. CF 480 E. Parking Lot

    CF 480 E. Parking Lot http://codeforces.com/contest/480/problem/E 题意: 给一个n*m的01矩阵,每次可以将一个0修改为1,求最大全0 ...

随机推荐

  1. 200行Python代码实现2048

    200行Python代码实现2048 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌面 ...

  2. python的Collections 模块

    Collections 模块 知识点 Counter 类 defaultdict 类 namedtuple 类 在这个实验我们会学习 Collections 模块.这个模块实现了一些很好的数据结构,它 ...

  3. css3 文字的设置

    1.text-shadow 有3个length参数,第1个表示水平偏移,第2个表示垂直偏移,第3个表示模糊(可选) .text11{text-shadow: 3px 3px 5px #f00 ;col ...

  4. bzoj千题计划271:bzoj4869: [六省联考2017]相逢是问候

    http://www.lydsy.com/JudgeOnline/problem.php?id=4869 欧拉降幂+线段树,每个数最多降log次,模数就会降为1 #include<cmath&g ...

  5. JavaScript 动态显示当前时间

    代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <tit ...

  6. Python爬虫之urllib模块2

    Python爬虫之urllib模块2 本文来自网友投稿 作者:PG-55,一个待毕业待就业的二流大学生. 看了一下上一节的反馈,有些同学认为这个没什么意义,也有的同学觉得太简单,关于Beautiful ...

  7. Python内置函数(10)——float

    英文文档: class float([x]) Return a floating point number constructed from a number or string x. If the ...

  8. Python-面向对象(二)-Day7

    1.字段 12.方法 43.属性 63.1.属性的基本使用 73.2.实例:对于主机列表 83.3.属性的两种定义方式 94.对于类的成员而言都有两种形式: 144.1.私有成员和公有成员的访问限制不 ...

  9. js控制表格实时编辑

    点击添加,在表格的最后一行添加一行表单元素,右侧按钮变为保存和取消.(点击保存,数据用ajax无刷新添加到界面,点击取消,取消此行的添加.)点击编辑,在本行改为表单,带有原来的值,右侧按钮变为确认和取 ...

  10. 云计算(2)it 是什么

    2015年,全世界在it上面的花费达到3亿8千亿美金之多. 云数据中心:核心基础架构,云计算的物理载体,提供数据处理.存储和高性能计算支撑,包括服务器.存储.冷却.机房空间和能耗管理等. 超大规模的云 ...