Codeforces Round #356 (Div. 1) C. Bear and Square Grid
3 seconds
256 megabytes
standard input
standard output
You have a grid with n rows and n columns. Each cell is either empty (denoted by '.') or blocked (denoted by 'X').
Two empty cells are directly connected if they share a side. Two cells (r1, c1) (located in the row r1 and column c1) and (r2, c2) areconnected if there exists a sequence of empty cells that starts with (r1, c1), finishes with (r2, c2), and any two consecutive cells in this sequence are directly connected. A connected component is a set of empty cells such that any two cells in the component are connected, and there is no cell in this set that is connected to some cell not in this set.
Your friend Limak is a big grizzly bear. He is able to destroy any obstacles in some range. More precisely, you can choose a square of size k × k in the grid and Limak will transform all blocked cells there to empty ones. However, you can ask Limak to help only once.
The chosen square must be completely inside the grid. It's possible that Limak won't change anything because all cells are empty anyway.
You like big connected components. After Limak helps you, what is the maximum possible size of the biggest connected component in the grid?
The first line of the input contains two integers n and k (1 ≤ k ≤ n ≤ 500) — the size of the grid and Limak's range, respectively.
Each of the next n lines contains a string with n characters, denoting the i-th row of the grid. Each character is '.' or 'X', denoting an empty cell or a blocked one, respectively.
Print the maximum possible size (the number of cells) of the biggest connected component, after using Limak's help.
5 2
..XXX
XX.XX
X.XXX
X...X
XXXX.
10
5 3
.....
.XXX.
.XXX.
.XXX.
.....
25
In the first sample, you can choose a square of size 2 × 2. It's optimal to choose a square in the red frame on the left drawing below. Then, you will get a connected component with 10 cells, marked blue in the right drawing.

炸掉任意一个k*k的矩阵内所有方块,然后问炸完最大的联通块的最大值。
n*n枚举我现在要炸哪个矩阵,由于每次枚举是把矩阵右移一位,我们可以考虑利用上次的信息。
(我都扯了些什么鬼……
反正就是每次删掉一列的信息,增加一列的信息而已。
预处理出原先的联通块,然后开个桶记录一下每个联通块被我现在的矩形覆盖的点数,当这个点数从0加到1时就给答案累计上这个联通块的大小,从1减到0就扔掉就好了。
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int read_p,read_ca;
inline int read(){
read_p=;read_ca=getchar();
while(read_ca<''||read_ca>'') read_ca=getchar();
while(read_ca>=''&&read_ca<='') read_p=read_p*+read_ca-,read_ca=getchar();
return read_p;
}
const int f[][]={{,},{,-},{,},{-,}};
int n,K,map[][],nm=,t[],mmh,MMH=,nu[];
char c[];
struct na{
int x,y;
na(int _x,int _y):x(_x),y(_y){}
};
queue<na> q;
inline void bfs(int x,int y){
register int i;
map[x][y]=++nm;
q.push(na(x,y));
while (!q.empty()){
nu[nm]++;
na k=q.front();q.pop();
for (i=;i<;i++)
if (map[k.x+f[i][]][k.y+f[i][]]==) map[k.x+f[i][]][k.y+f[i][]]=nm,q.push(na(k.x+f[i][],k.y+f[i][]));
}
}
int main(){
register int i,j,k;
n=read();K=read();
for (i=;i<=n;i++){
scanf("%s",c);
for (j=;j<=n;j++) map[i][j]=c[j-]=='X'?-:;
}
for (i=;i<=n;i++) map[i][]=map[i][n+]=-;
for (j=;j<=n;j++) map[][j]=map[n+][j]=-;
for (i=;i<=n;i++)
for (j=;j<=n;j++) if (map[i][j]==) bfs(i,j);
for (i=;i<=n-K+;i++){
memset(t,,sizeof(t));mmh=;
for (j=i;j<i+K;j++)
for (k=;k<=K;k++) if (map[j][k]==-) mmh++;else{
if ((++t[map[j][k]])==) mmh+=nu[map[j][k]];
}
for (k=;k<=K;k++){
if (map[i-][k]!=-) if ((++t[map[i-][k]])==) mmh+=nu[map[i-][k]];
if (map[i+K][k]!=-) if ((++t[map[i+K][k]])==) mmh+=nu[map[i+K][k]];
}
for (j=i;j<i+K;j++)
if (map[j][K+]!=-) if ((++t[map[j][K+]])==) mmh+=nu[map[j][K+]];
if (mmh>MMH) MMH=mmh;
for (k=;k<=n-K;k++){
for (j=i;j<i+K;j++){
if (map[j][k+K]==-) mmh++;
if (map[j][k+K+]!=-) if ((++t[map[j][k+K+]])==) mmh+=nu[map[j][k+K+]];
if (map[j][k]==-) mmh--;
if (map[j][k-]!=-) if ((--t[map[j][k-]])==) mmh-=nu[map[j][k-]];
}
if (map[i-][k+K]!=-) if ((++t[map[i-][k+K]])==) mmh+=nu[map[i-][k+K]];
if (map[i-][k]!=-) if ((--t[map[i-][k]])==) mmh-=nu[map[i-][k]];
if (map[i+K][k+K]!=-) if ((++t[map[i+K][k+K]])==) mmh+=nu[map[i+K][k+K]];
if (map[i+K][k]!=-) if ((--t[map[i+K][k]])==) mmh-=nu[map[i+K][k]];
if (mmh>MMH) MMH=mmh;
}
}
printf("%d\n",MMH);
}
Codeforces Round #356 (Div. 1) C. Bear and Square Grid的更多相关文章
- Codeforces Round #356 (Div. 2) E. Bear and Square Grid 滑块
E. Bear and Square Grid 题目连接: http://www.codeforces.com/contest/680/problem/E Description You have a ...
- Codeforces Round #356 (Div. 2) C. Bear and Prime 100(转)
C. Bear and Prime 100 time limit per test 1 second memory limit per test 256 megabytes input standar ...
- Codeforces Round #356 (Div. 2)B. Bear and Finding Criminals(水题)
B. Bear and Finding Criminals time limit per test 2 seconds memory limit per test 256 megabytes inpu ...
- Codeforces Round #356 (Div. 2)A. Bear and Five Cards(简单模拟)
A. Bear and Five Cards time limit per test 2 seconds memory limit per test 256 megabytes input stand ...
- Codeforces Round #356 (Div. 1) D. Bear and Chase 暴力
D. Bear and Chase 题目连接: http://codeforces.com/contest/679/problem/D Description Bearland has n citie ...
- Codeforces Round #356 (Div. 2) D. Bear and Tower of Cubes dfs
D. Bear and Tower of Cubes 题目连接: http://www.codeforces.com/contest/680/problem/D Description Limak i ...
- Codeforces Round #356 (Div. 2) C. Bear and Prime 100 水题
C. Bear and Prime 100 题目连接: http://www.codeforces.com/contest/680/problem/C Description This is an i ...
- Codeforces Round #356 (Div. 2) B. Bear and Finding Criminal 水题
B. Bear and Finding Criminals 题目连接: http://www.codeforces.com/contest/680/problem/B Description Ther ...
- Codeforces Round #356 (Div. 2) A. Bear and Five Cards 水题
A. Bear and Five Cards 题目连接: http://www.codeforces.com/contest/680/problem/A Description A little be ...
随机推荐
- Scala 安装 Exception in thread "main" java.lang.VerifyError: Uninitialized object exists on backward branch 96
windows下载安装完最新版本的Scala(2.12.4)后,终端如下错误 C:\Users\Administrator>scala -versionException in thread & ...
- Android Weekly Notes Issue #288
Android Weekly Issue #288 December 17th, 2017 Android Weekly Issue #288 本期内容主要包括介绍Kotlin DSL使用kotlin ...
- 为什么CPU需要时钟这种概念?
本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/132 最近在研究计算机里的基本逻辑电路,想到一个问题:为什么CP ...
- fdisk 命令详解
fdisk 作用: 查看磁盘实体使用情况,也可对硬盘分区. 选项: -b 分区大小 -l 列出指定的外围设备的分区表状况 -s 分区编号, 将指定的分区大小输出到标准输出上, 单位为区块 -u ...
- 谈谈序列化—实体bean一定要实现Serializable接口?
导读:最近在做项目的过程中,发现一个问题,就是我们最开始的时候,传递参数包括返回类型,都有map类型.但是由于map每次都要匹配key值,很麻烦.所以在之后就将参数传递和返回类型全都改成了实体bean ...
- Macaca环境搭建踩坑总结
1.使用命令 npm i macaca-android -g 安装一直不成功,使用Macaca doctor 一直没有显示出android C:\Users\ABC>npm i macaca- ...
- ubuntu 安装 pythonenv
This will get you going with the latest version of pyenv and make it easy to fork and contribute any ...
- 使用sed,grep 批量修改文件内容
使用sed命令可以进行字符串的批量替换操作,以节省大量的时间及人力: 使用的格式如下: sed -i "s/oldstring/newstring/g" `grep oldstri ...
- css条纹背景
一. 水平条纹 1. 两种颜色: html <div class="stripe"></div> css .stripe{ width: 250px; he ...
- hadoop的安装和配置(三)完全分布式模式
博主会用三篇文章为大家详细说明hadoop的三种模式: 本地模式 伪分布模式 完全分布模式 完全分布式模式: 前面已经说了本地模式和伪分布模式,这两种在hadoop的应用中并不用于实际,因为几乎没人会 ...