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 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) are connected 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.
Sample Input
5 2
..XXX
XX.XX
X.XXX
X...X
XXXX.
Sample Output
10
Hint
题意
给你n*n的矩阵,你有一个k*k的框框,可以把矩阵的某一块给框起来
然后这个框框内的所有格子都是.了,现在你需要使得这个矩阵的连通块最大,那么这个连通块的大小是多少呢?
题解:
简单点,我们思考一下,最大的这个答案一定是这个框框所在的连通块,这个很显然,因为你加了框框之后,连通块的大小是会增加或者保持不变的。
所以我们直接暴力枚举所有框框摆放的位置就好了。
我们利用滑块的思想去做这道题,那么我们维护这个框框的时候,就只用维护他的边界信息了
这样就可以把n4->n3了。
然后这道题就可以AC了。
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 505;
int n,k;
char grid[maxn][maxn];
int cc[maxn][maxn];
int cc_size[maxn*maxn];
int when_added[maxn*maxn];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,-1,1};
bool inside(int x,int y)
{
if(x<0||x>=n)return false;
if(y<0||y>=n)return false;
return true;
}
void dfs(int x,int y,int num)
{
cc[x][y]=num;
++cc_size[num];
for(int i=0;i<4;i++)
{
int x2=x+dx[i];
int y2=y+dy[i];
if(inside(x2,y2)&&grid[x2][y2]=='.'&&cc[x2][y2]==0)
dfs(x2,y2,num);
}
}
void add(int x,int y,int& ans,int num)
{
if(inside(x,y)&&grid[x][y]=='.')
{
int id = cc[x][y];
if(when_added[id]!=num)
{
when_added[id]=num;
ans+=cc_size[id];
}
}
}
void QAQ()
{
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
scanf("%s",grid[i]);
int cnt = 0;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(grid[i][j]=='.'&&cc[i][j]==0)
dfs(i,j,++cnt);
int cur_time = 1;
int Ans = 0;
for(int y_low=0;y_low+k-1<n;y_low++)
{
for(int x=0;x<k;x++)
for(int y=y_low;y<y_low+k;y++)
--cc_size[cc[x][y]];
for(int x_low=0;x_low+k-1<n;x_low++)
{
int ans = k*k;
for(int x=x_low;x<x_low+k;x++)
{
add(x,y_low-1,ans,cur_time);
add(x,y_low+k,ans,cur_time);
}
for(int y=y_low;y<y_low+k;y++)
{
add(x_low-1,y,ans,cur_time);
add(x_low+k,y,ans,cur_time);
}
++cur_time;
Ans=max(Ans,ans);
if(x_low+k!=n)
{
for(int y=y_low;y<y_low+k;y++)
{
++cc_size[cc[x_low][y]];
--cc_size[cc[x_low+k][y]];
}
}
}
for(int x=n-k;x<n;x++)
for(int y=y_low;y<y_low+k;y++)
++cc_size[cc[x][y]];
}
cout<<Ans<<endl;
}
int main()
{
QAQ();
}
Codeforces Round #356 (Div. 2) E. Bear and Square Grid 滑块的更多相关文章
- Codeforces Round #356 (Div. 1) C. Bear and Square Grid
C. Bear and Square Grid time limit per test 3 seconds memory limit per test 256 megabytes input stan ...
- 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 ...
随机推荐
- HTTP与HTTPS相关知识
URL的开头一般会有http或https,这是访问资源需要的协议类型.有时还会看到ftp.sftp.smb开头的URL,这些都是协议类型.一般使用得最多的还是http和https. HTTP HTTP ...
- aarch64_g4
golang-github-inconshreveable-muxado-devel-0-0.7.gitf693c7e.fc26.noarch.rpm 2017-02-11 16:47 30K fed ...
- 使用PyMongo访问需要认证的MongoDB
Windows 10家庭中文版,Python 3.6.4,PyMongo 3.7.0,MongoDB 3.6.3,Scrapy 1.5.0, 前言 在Python中,使用PyMongo访问Mongod ...
- 缓存数据库-redis(管道)
一:Redis 管道技术 Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务.这意味着通常情况下一个请求会遵循以下步骤: 客户端向服务端发送一个查询请求,并监听Socket返回,通常 ...
- 正则表达式之你不知道的replace
我们都知道js内置类String提供了一个replace方法,可以把指定字符串替换为另一个字符串,他的基础用法如下: var str="hello world"; var str= ...
- Java标记接口
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------这篇博客主要来谈谈" ...
- 用django-cors-headers做跨域
什么是CORS? CORS(跨域资源共享,Cross-Origin Resource Sharing)是一种跨域访问的机制,可以让Ajax实现跨域访问. 其实,在服务器的response header ...
- Linux学习笔记:cat、tac、more、less、head、tail查看文件内容
Linux下查看文件内容可以通过以下命令: cat tac more less head tail nl tailf 1.cat 由第一行开始显示内容,并将所有内容输出.当文件过大时,使用cat查看不 ...
- 20165203实验四 Andriod程序设计
20165203实验四 Andriod程序设计 实验内容 安装 Android Stuidio 学习Android Stuidio调试应用程序 实验要求 1.没有Linux基础的同学建议先学习< ...
- 提高eclipse使用效率(一)--使用快捷键
编辑代码常用快捷键 格式化代码的快捷键 Ctrl + Shift + F 格式化缩进的快捷键是 Ctrl + I,只能对选中的文本进行缩进 删除一行的快捷键是 Ctrl + D 当前窗口最大化最小化切 ...