●CodeForces 480E Parking Lot
题链:
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的更多相关文章
- Parking Lot CodeForces - 480E
大意: 给定01矩阵, 单点赋值为1, 求最大全0正方形. 将询问倒序处理, 那么答案一定是递增的, 最多增长$O(n)$次, 对于每次操作暴力判断答案是否增长即可, 也就是说转化为判断是否存在一个边 ...
- Codeforces 46D Parking Lot
传送门 D. Parking Lot time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Codeforces 219E Parking Lot 线段树
Parking Lot 线段树区间合并一下, 求当前要占的位置, 不包括两端点的写起来方便一点. #include<bits/stdc++.h> #define LL long long ...
- CF数据结构练习
1. CF 438D The Child and Sequence 大意: n元素序列, m个操作: 1,询问区间和. 2,区间对m取模. 3,单点修改 维护最大值, 取模时暴力对所有>m的数取 ...
- 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 ...
- Codeforces 480.E Parking Lot
E. Parking Lot time limit per test 3 seconds memory limit per test 256 megabytes input standard inpu ...
- Codeforces Parking Lot
http://codeforces.com/problemset/problem/630/I 简单的排列组合,推式子技巧:举一个小样例,看着推,别抽象着推,容易错 #include <iostr ...
- 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 ...
- CF 480 E. Parking Lot
CF 480 E. Parking Lot http://codeforces.com/contest/480/problem/E 题意: 给一个n*m的01矩阵,每次可以将一个0修改为1,求最大全0 ...
随机推荐
- python实现朴素贝叶斯
参考:<机器学习实战>- Machine Learning in Action 一. 基本思想 简单的说,用概率的高低来决定数据属于哪一类别,这就是贝叶斯决策理论的核心思想,即选择具有最 ...
- 201621123062《java程序设计》第六周作业总结
1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结. 注1:关键词与内容不求多,但概念之间的联系要清晰 ...
- java 注解的实现机制
一.什么是注解: 注解是标记,也可以理解成是一种应用在类.方法.参数.属性.构造器上的特殊修饰符.注解作用有以下三种: 第一种:生成文档,常用的有@param@return等. 第二种:替代配置文件的 ...
- httpClient 中的post或者get请求
httpClient相对于java自带的请求功能更加强大,下面就以例子的形式给出: //HttpClient Get请求 private static void register() { try { ...
- vue mint-ui 三级地址联动
我也是第一次写这种地址联动的 刚开始的时候 我还以为直接用select来写 后来公司的ios告知并不是这样的 他说应该时这样的 于是第一想法 赶紧找插件吧 但是找了一会未果 就问了公司大神 他刚开始 ...
- js 从一个函数中传递值到另一个函数
一个函数的调用大家都会用 我今天在调接口的时候突然发现需要引用个另一个函数中拿到的值 举个栗子 刚开始 我是这样调用的 alert弹出的是 hello world . 但是我a函数内部还有一个函数 画 ...
- 常见web攻击总结
搞Web开发离不开安全这个话题,确保网站或者网页应用的安全性,是每个开发人员都应该了解的事.本篇主要简单介绍在Web领域几种常见的攻击手段及Java Web中的预防方式. XSS SQL注入 DDOS ...
- 新概念英语(1-139)Is that you, John?
Lesson 139 Is that you, John? 是你吗,约翰? Listen to the tape then answer this question. Which John Smith ...
- JavaScript中Array数组的方法
查找: indexOf.lastIndexOf 迭代:every.filter.forEach.map.somereduce.reduceRight 用法: /* 1 查找方法: * arr.inde ...
- mysql中的函数与存储过程
mysql中的函数:1 mysql下创建函数: 1.1 语法: delimiter $$ -- 设置分隔符,默认是; 设置成其他符号,让编译器知道我们函数编写的结束,此处设置成$$ create fu ...