Parking Lot CodeForces - 480E
大意: 给定01矩阵, 单点赋值为1, 求最大全0正方形.
将询问倒序处理, 那么答案一定是递增的, 最多增长$O(n)$次, 对于每次操作暴力判断答案是否增长即可, 也就是说转化为判断是否存在一个边长$x$的正方形包含给定点, 可以维护左右两侧第一个1的位置, 从上往下滑动窗口即可$O(n)$判断, 总复杂度$O(n^2)$
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <math.h>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <string.h>
#include <bitset>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define PER(i,a,n) for(int i=n;i>=a;--i)
#define hr putchar(10)
#define pb push_back
#define lc (o<<1)
#define rc (lc|1)
#define mid ((l+r)>>1)
#define ls lc,l,mid
#define rs rc,mid+1,r
#define x first
#define y second
#define io std::ios::sync_with_stdio(false)
#define endl '\n'
#define DB(a) ({REP(__i,1,n) cout<<a[__i]<<' ';hr;})
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int P = 1e9+7, INF = 0x3f3f3f3f;
ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
ll qpow(ll a,ll n) {ll r=1%P;for (a%=P;n;a=a*a%P,n>>=1)if(n&1)r=r*a%P;return r;}
ll inv(ll x){return x<=1?1:inv(P%x)*(P-P/x)%P;}
//head const int N = 2e3+10;
int n, m, k, ans, Ans[N];
char s[N][N];
int dp[N][N], L[N][N], R[N][N], x[N], y[N];
void upd(int i) {
REP(j,1,m) if (s[i][j]=='.') L[i][j] = L[i][j-1]?L[i][j-1]:j;
PER(j,1,m) if (s[i][j]=='.') R[i][j] = R[i][j+1]?R[i][j+1]:j;
}
void DP() {
REP(i,1,n) REP(j,1,m) if (s[i][j]=='.') {
dp[i][j] = min({dp[i-1][j],dp[i][j-1],dp[i-1][j-1]})+1;
ans = max(ans,dp[i][j]);
}
REP(i,1,n) upd(i);
}
int chk(int U, int D, int y, int v) {
if (D-U+1<v) return 0;
deque<int> q1, q2;
REP(i,U,D) {
if (q1.size()&&i-q1[0]==v) q1.pop_front();
if (q2.size()&&i-q2[0]==v) q2.pop_front();
while (q1.size()&&L[i][y]>=L[q1.back()][y]) q1.pop_back();
while (q2.size()&&R[i][y]<=R[q2.back()][y]) q2.pop_back();
q1.push_back(i), q2.push_back(i);
if (i-U+1>=v&&R[q2[0]][y]-L[q1[0]][y]+1>=v) return 1;
}
return 0;
} int main() {
scanf("%d%d%d", &n, &m, &k);
REP(i,1,n) scanf("%s", s[i]+1);
REP(i,1,k) {
scanf("%d%d", x+i, y+i);
s[x[i]][y[i]] = 'X';
}
DP();
PER(i,1,k) {
Ans[i] = ans;
s[x[i]][y[i]] = '.', upd(x[i]);
int U = x[i], D = x[i];
while (s[U][y[i]]=='.') --U; ++U;
while (s[D][y[i]]=='.') ++D; --D;
while (chk(U,D,y[i],ans+1)) ++ans;
}
REP(i,1,k) printf("%d\n", Ans[i]);
}
Parking Lot CodeForces - 480E的更多相关文章
- ●CodeForces 480E Parking Lot
题链: http://codeforces.com/problemset/problem/480/E题解: 单调队列,逆向思维 (在线的话应该是分治做,但是好麻烦..) 离线操作,逆向考虑, 最后的状 ...
- Codeforces 46D Parking Lot
传送门 D. Parking Lot time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- 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 219E Parking Lot 线段树
Parking Lot 线段树区间合并一下, 求当前要占的位置, 不包括两端点的写起来方便一点. #include<bits/stdc++.h> #define LL long long ...
- 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 ...
- Codeforces Round #127 (Div. 1) B. Guess That Car! 扫描线
B. Guess That Car! 题目连接: http://codeforces.com/contest/201/problem/B Description A widely known amon ...
随机推荐
- hihoCoder week15 最近公共祖先·二
tarjan求lca 就是dfs序中用并查集维护下,当访问到询问的第二个点u的时候 lca就是第一点的find(fa[v]) fa[v] = u; // 当v为u的儿子 且 v已经dfs完毕 #i ...
- LOJ#2444. 「NOI2011」阿狸的打字机
题目描述 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有 \(28\) 个按键,分别印有 \(26\) 个小写英文字母和 B . P 两个字母. 经阿狸研究发现,这个打字机是 ...
- Activit工作流学习例子
看了网上一些文章,动手操作了一遍,终于学会了Activit的一些常规使用. 一.Eclipse中的Activiti插件安装 Activiti有一个Eclipse插件,Activiti Eclipse ...
- 使用PlaceHolder,测试碰见的问题
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFa ...
- c# 后台post,包含file文件
http request 相关 private bool Upload(KeyValuePair<string, string>[] paramString,Stream paramFil ...
- SAP月末结账年结流程
SAP月末结账年结流程 SAP月末结账操作指南 流程描述:FI期末结帐流程包括应收帐款.应付帐款.固定资产.管理会计结帐.总帐结帐等一系列结帐过程,对于年结增加了余额结转及固定资产年度改变等动作,通过 ...
- windows下远程连接Mysql
使用“Ctrl + R”组合键快速打开cmd窗口,并输入“cmd”命令,打开cmd窗口. 使用“mysql -uroot -proot”命令可以连接到本地的mysql服务. 使用“use mysql” ...
- C#Listview添加数据,选中最后一行,滚屏
this.listView.Items.Add(lvi); this.listView.EnsureVisible(this.listView.Items.Count - 1); this.listV ...
- 手把手教你学习R语言
本文为带大家了解R语言以及分段式的步骤教程! 人们学习R语言时普遍存在缺乏系统学习方法的问题.学习者不知道从哪开始,如何进行,选择什么学习资源.虽然网络上有许多不错的免费学习资源,然而它们多过了头,反 ...
- Codeforces 85 D. Sum of Medians
题目链接:http://codeforces.com/contest/85/problem/D 做法果然男默女泪啊..... 大概就是直接开了一个$vector$每次插入删除都用自带的$insert$ ...