题链:

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. hadoop-2.7.1伪分布环境搭建

    1.准备Linux环境  1.0 点击VMware快捷方式,右键打开文件所在位置 -> 双击vmnetcfg.exe -> VMnet1 host-only ->修改subnet i ...

  2. Treeview获取父节点

    private void treeView1_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object&g ...

  3. JavaPersistenceWithHibernate第二版笔记Getting started with ORM-001用JPA和Hibernate实现HellowWorld(JTA、Bitronix)

    一.结构 二.model层 1. package org.jpwh.model.helloworld; import javax.persistence.Entity; import javax.pe ...

  4. HDU 1241 Oil Deposits (DFS/BFS)

    Oil Deposits Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  5. xamarin android 开发

    开始环境vs2017 直接创建android 项目,左边是android studio 的项目目录  右边是vs创建的android 项目目录 结构基本相同,有res对应的Resources文件 加载 ...

  6. npm 发布一个全局的指令

    我们经常使用 npm i  -g  xxxx 安装完成一个包之后,就能直接使用对应的指令.例如安装  vue-cli 或者 express 等 那么下面我们自己做一个类似的效果: 首先要对 npm 发 ...

  7. django中利用FastDFS来上传图片的流程

    好处:海量问题,存储容量扩展方便,文件内容重复并且对静态文件的访问也有了提升等.

  8. ubuntu系统安装微信小程序开发工具

    在ubuntu系统中安装微信小程序开发工具之前,先要安装wine与git 一.安装wine 1.如果您的系统是64位,启用32位架构(如果您还没有) sudo dpkg --add-architect ...

  9. urllib和urllib2之间的区别

    urllib和urllib2都是接受URL请求的相关模块,但是提供了不同功能. urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL.这意味着 ...

  10. js动态加载图片核心代码

    objMapHeart.src = obj.getAttribute("ItemImage"); //==============图片预加载处理================== ...