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 ...
随机推荐
- 【JMeter】if语句中不能Failure=false解决办法
错误写法: if(roomId.matches("regEx")) Failure=false; else{ Failure=true; FailureMessage=" ...
- Java8函数之旅 (八) - 组合式异步编程
前言 随着多核处理器的出现,如何轻松高效的进行异步编程变得愈发重要,我们看看在java8之前,使用java语言完成异步编程有哪些方案. JAVA8之前的异步编程 继承Thead类,重写run方法 实现 ...
- ubuntu16.04 查询ip,网关,dns信息
用ifconfig命令只能查询ip,子网掩码信息,不能获取dns和网关信息 用下面命令即可查询 nmcli dev show
- vbs的一些入门基础。。。
VBS(VBScript的进一步简写)是基于Visual Basic的脚本语言. Microsoft Visual Basic是微软公司出品的一套可视化编程工具, 语法基于Basic. 脚本语言, 就 ...
- ElasticSearch 学习记录之ES高亮搜索
高亮搜索 ES 通过在查询的时候可以在查询之后的字段数据加上html 标签字段,使文档在在web 界面上显示的时候是由颜色或者字体格式的 GET /product/_search { "si ...
- free 命令详解
作用:显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区 选项: -b 以byte为单位显示内存使用情况 -k 以kb 为单位显示内存使用情况 -m 以mb 为单位显示内存使用情 ...
- Elastic 技术栈之 Filebeat
Elastic 技术栈之 Filebeat 简介 Beats 是安装在服务器上的数据中转代理. Beats 可以将数据直接传输到 Elasticsearch 或传输到 Logstash . Beats ...
- Mysql中字符集总结
有时候,在Mysql数据库中会经常遇到乱码的问题,现在普遍的做法就是全部强行把编码格式都设置成utf8模式,就可以解决这个问题,以前是知其然,不知其所以然,今天我就稍微研究了下Mysql的字符集. 就 ...
- \Process(sqlservr)\% Processor Time 计数器飙高
计数器" \Process(sqlservr)\% Processor Time",是经常监测,看看SQL Server如何消耗CPU资源.sqlserver是如何利用现有的资源; ...
- vue2 watch引用类型 失败原因
vue中watch基本用法: new Vue({ el: '#t1', data: { a: { b: 1, c: 2 }, }, methods: { ch() { this.a.d=5 //不打印 ...