CF 480 E. Parking Lot
CF 480 E. Parking Lot
http://codeforces.com/contest/480/problem/E
题意:
给一个n*m的01矩阵,每次可以将一个0修改为1,求最大全0的矩阵。
分析:
将询问离线,从后往前处理询问,相当于每次将一个1变成0,答案是递增的。
用悬线法或者单调栈来求。
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#include<cctype>
#include<set>
#include<vector>
#include<queue>
#include<map>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ; char a[N][N];
int x[N], y[N], L[N], R[N], U[N][N], D[N][N], q1[N], q2[N], ans[N], sk[N];
int Ans, n, m; void solve() {
for (int i=; i<=n; ++i)
for (int j=; j<=m; ++j)
U[i][j] = a[i][j] == '.' ? U[i-][j] + : ;
for (int i=n; i>=; --i)
for (int j=; j<=m; ++j)
D[i][j] = a[i][j] == '.' ? D[i+][j] + : ;
for (int i=; i<=n; ++i) { // 单调栈
U[i][] = U[i][m+] = -;
for (int top=,j=; j<=m+; ++j) {
while (top > && U[i][j] < U[i][sk[top]]) R[sk[top]] = j, top--;
sk[++top] = j;
}
for (int top=,j=m; j>=; --j) {
while (top > && U[i][j] < U[i][sk[top]]) L[sk[top]] = j, top --;
sk[++top] = j;
}
for (int j=; j<=m; ++j)
Ans = max(Ans, min(U[i][j], R[j] - L[j] - ));
}
/*memset(R, 0x3f, sizeof(R)); // 悬线法
for (int i=1; i<=n; ++i) {
int last = 0;
for (int j=1; j<=m; ++j) {
if (a[i][j] == '.') L[j] = max(L[j], last + 1);
else last = j, L[j] = 0;
}
last = m + 1;
for (int j=m; j>=1; --j) {
if (a[i][j] == '.') R[j] = min(R[j], last - 1);
else last = j, R[j] = m + 1;
}
for (int j=1; j<=m; ++j)
Ans = max(Ans, min(U[i][j], R[j] - L[j] + 1));
}*/
}
bool update(int x,int k) { // 判断能否组成k*k的方阵
int L1 = , R1 = , L2 = , R2 = ;
for (int j=; j<=m; ++j) {
while (L1 <= R1 && j - q1[L1] + > k) L1 ++;
while (L1 <= R1 && U[x][q1[R1]] >= U[x][j]) R1 --;
q1[++R1] = j; while (L2 <= R2 && j - q2[L2] + > k) L2 ++;
while (L2 <= R2 && D[x][q2[R2]] >= D[x][j]) R2 --;
q2[++R2] = j; if (j >= k && U[x][q1[L1]] + D[x][q2[L2]] - >= k) {
Ans = k;
return true;
}
}
return false;
}
void Change(int x,int y) {
a[x][y] = '.';
for (int i=x; i<=n; ++i) U[i][y] = a[i][y] == '.' ? U[i-][y] + : ;
for (int i=x; i>=; --i) D[i][y] = a[i][y] == '.' ? D[i+][y] + : ;
}
int main() {
n = read(), m = read(); int Q = read();
for (int i=; i<=n; ++i) scanf("%s",a[i]+);
for (int i=; i<=Q; ++i) {
x[i] = read(),y[i] = read();
a[x[i]][y[i]] = 'X';
}
solve();
for (int i=Q; i>=; --i) {
ans[i] = Ans;
Change(x[i], y[i]);
while (update(x[i], Ans + ));
}
for (int i=; i<=Q; ++i) printf("%d\n",ans[i]);
return ;
}
CF 480 E. Parking Lot的更多相关文章
- Codeforces 480.E Parking Lot
E. Parking Lot time limit per test 3 seconds memory limit per test 256 megabytes input standard inpu ...
- 【26.8%】【CF 46D】Parking Lot
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...
- CF 480 B Long Jumps (map标记)
题目链接:http://codeforces.com/contest/480/problem/B 题目描述: Long Jumps Valery is a PE teacher at a ...
- CF数据结构练习
1. CF 438D The Child and Sequence 大意: n元素序列, m个操作: 1,询问区间和. 2,区间对m取模. 3,单点修改 维护最大值, 取模时暴力对所有>m的数取 ...
- ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 5166'
凌晨收到同事电话,反馈应用程序访问Oracle数据库时报错,当时现场现象确认: 1. 应用程序访问不了数据库,使用SQL Developer测试发现访问不了数据库.报ORA-12570 TNS:pac ...
- cf之路,1,Codeforces Round #345 (Div. 2)
cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅..... ...
- cf Round 613
A.Peter and Snow Blower(计算几何) 给定一个点和一个多边形,求出这个多边形绕这个点旋转一圈后形成的面积.保证这个点不在多边形内. 画个图能明白 这个图形是一个圆环,那么就是这个 ...
- ARC下OC对象和CF对象之间的桥接(bridge)
在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics.Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环 ...
- [Recommendation System] 推荐系统之协同过滤(CF)算法详解和实现
1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...
随机推荐
- 理解Underscore中的flatten函数
最近是在所在实习公司的第一个sprint,有个朋友又请假了,所以任务比较重,一直这么久都没怎么更新了,这个周末赖了个床,纠结了一会儿决定还是继续写这个系列,虽然比较乏味,但是学到的东西还是很多的. 之 ...
- Codeforces Round #436 (Div. 2)【A、B、C、D、E】
Codeforces Round #436 (Div. 2) 敲出一身冷汗...感觉自己宛如智障:( codeforces 864 A. Fair Game[水] 题意:已知n为偶数,有n张卡片,每张 ...
- 用画小狗的方法来解释Java中的值传递
在开始看我画小狗之前,咱们先来看道很简单的题目: 下面程序的输出是什么? Dog myDog = new Dog("旺财"); changeName(myDog); System. ...
- bzoj1413 [ZJOI2009]取石子游戏
Description 在研究过Nim游戏及各种变种之后,Orez又发现了一种全新的取石子游戏,这个游戏是这样的: 有n堆石子,将这n堆石子摆成一排.游戏由两个人进行,两人轮流操作,每次操作者都可以从 ...
- ResNet 修改
https://github.com/tornadomeet/ResNet apache 开源项目 修改如下: 训练模块 import argparse,logging,os import mxnet ...
- im2rec打包图片
https://mxnet.incubator.apache.org/faq/finetune.html python ~/mxnet/tools/im2rec.py --list --recursi ...
- TensorFlow基础(二)实现神经网络
(1)前向传播算法 神经网络的前向传播算法主要构成部分: 1.神经网络的输入: 2.神经网络的连接结构:神经网络是由神经元(节点)构成的 3.每个神经元中的参数. (2)TensorFlow随机数生成 ...
- Node.js发布http服务
Node.js发布http服务 2018-11-09 09:43:03 Visit 0 简单服务 var http = require(\'http\'); http.createServer( ...
- PAT——1007. 素数对猜想
让我们定义 dn 为:dn = pn+1 - pn,其中 pi 是第i个素数.显然有 d1=1 且对于n>1有 dn 是偶数.“素数对猜想”认为“存在无穷多对相邻且差为2的素数”. 现给定任意正 ...
- hdu 1520 Anniversary party(第一道树形dp)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1520 Anniversary party Time Limit: 2000/1000 MS (Java ...