题链:

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. Beta冲刺计划---Day0

    Beta阶段报告---Day0 1.需要改进完善的功能   我们上一阶段开发由于开发时间匆忙,对于爬虫耗时的优化没有考虑.优化的空间我在Alpha阶段的总结报告里说过,具体看下图.   这张图显示出爱 ...

  2. fs输出文件目录

    var http = require("http"); var fs = require("fs"); var server = http.createServ ...

  3. segmentedControl设置字体和字体颜色问题

    NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:[UIColor blackColor],UITextAttributeT ...

  4. 日志 --BUG记录

    2014-12-15日 在做520wawa的免费推广   部署web应用时 错把path设置为"/*",导致启动tomcat时,导致错误 <Context path=&quo ...

  5. 关于GPUImage的导入

    对于GPUImage的使用方面,GitHub上已经非常详细了,就不一一赘述了,但是对于项目的导入来说,最好的方式是 1.下载GPUImage并解压 2.打开压缩包后如图 3.打开终端,cd到此目录 4 ...

  6. php抽象类和接口的区别

    php抽象类和接口的区别 tags:抽象类 接口 抽象类和接口 php 引言:这是一个面试经常被问到的问题,也是一个经典问题.我们尽量引用官方权威的说明或者经过实验来证明本文所说的内容准确性. 抽象类 ...

  7. Mongodb 3 查询优化(语句优化、建索引)

    一.explain(),语句分析工具 MongoDB 3.0之后,explain的返回与使用方法与之前版本有了很大的变化,介于3.0之后的优秀特色和我们目前所使用给的是3.0.7版本,本文仅针对Mon ...

  8. JAVA_SE基础——14.循环结构语句

    建议有些基础的同学阅读,0基础可能会有些困难(最好看正文配合基础课本的例子) 所谓循环语句主要就是在满足条件的情况下反复执行某一个操作.Java提供了3种常用的循环语句,分别为for循环语句.whil ...

  9. phalcon框架命名空间

    命名空间第一影像就是实际上就相当宏定义,就是需要把一个很长的带有路径的类文件指定一个空间,然后就可直接用简单简写模式 当然如果是外部文件需要首先引入外部文件,如果不引入外部文件还是会报错.一般最会出错 ...

  10. C++ 异常小记

    catch必定使用拷贝构造函数 如下代码编译不通过,因为拷贝构造被标记delete #include <stdexcept> #include <cstdlib> #inclu ...