C. Bear and Square Grid
time limit per test

3 seconds

memory limit per test

256 megabytes

input

standard input

output

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?

Input

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.

Output

Print the maximum possible size (the number of cells) of the biggest connected component, after using Limak's help.

Examples
input
5 2
..XXX
XX.XX
X.XXX
X...X
XXXX.
output
10
input
5 3
.....
.XXX.
.XXX.
.XXX.
.....
output
25
Note

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的更多相关文章

  1. 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 ...

  2. 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 ...

  3. 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 ...

  4. 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 ...

  5. 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 ...

  6. 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 ...

  7. 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 ...

  8. 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 ...

  9. 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 ...

随机推荐

  1. 深入理解java虚拟机_前言

    2.JVM虚拟机 2.1  概述 java获得广泛认可主要是因为: (1)  java是一门结构严谨.面向对象的编程语言; (2)  java摆脱了硬件平台的束缚,实现了“一次编写,到处运行”的理想; ...

  2. GVIM与模板——让FPGA开发变得更简单

    还在使用FPGA开发环境自带的代码编辑器?还在逐个字母敲击冗长重复的代码?明德扬至简设计法让你快速提高代码编写效率!利用GVIM这一高效的编辑工具并添加自定义模板,通过简短的脚本命令即可自动生成所有常 ...

  3. StringUtils工具类常用方法

    前言:工作中看到项目组里的大牛写代码大量的用到了StringUtils工具类来做字符串的操作,便学习整理了一下,方便查阅. isEmpty(String str) 是否为空,空格字符为false is ...

  4. signalr中Group 分组群发消息的简单使用

    前一段时间写了几篇关于signalr的文章 1.MVC中使用signalR入门教程 2.mvc中signalr实现一对一的聊天 3.Xamarin android中使用signalr实现即时通讯 在平 ...

  5. <!--[if lte IE 8][endif] ]-->IE下判断IE版本的语句

    <!--[if lte IE 6]> <![endif]--> IE6及其以下版本可见 <!--[if lte IE 7]> <![endif]--> ...

  6. solr安装配置

    1.solr是基于tomcat安装部署的 2.网上下载solr-5.2.1 http://lucene.apache.org/solr/downloads.html 3.解压solr文件 tar zx ...

  7. docker:(1)docker基本命令使用及发布镜像

    docker镜像可以完全看作一台全新的电脑使用,无论什么镜像都是对某一东西进行了配置,然后打包后可以快速移植到需要的地方直接使用 省去复杂的配置工作 比如java web项目部署,如果是新部署,需要装 ...

  8. MySQL视图,触发器,事务,存储过程,函数

    create triggr triafterinsertcmdlog after insert on cmd_log FOR EACH ROW trigger_body .#NEW : 代表新的记录 ...

  9. 学习整理与细化(2)——HTML VS XHTML

    <html> <head>//文档头 <title>webpage title</title> </head> <body>// ...

  10. MySQL优化三 表结构优化

    由于MySQL数据库是基于行(Row)存储的数据库,而数据库操作 IO 的时候是以 page(block)的方式,也就是说,如果我们每条记录所占用的空间量减小,就会使每个page中可存放的数据行数增大 ...