n<=500,n*n的01矩阵,可以选择一个k*k的矩阵全变1,求最大1联通区域。

敢敢n^3。。模拟k*k的矩阵的位置,从左到右扫的时候,每变一个位置只会引起边界的信息变化,就记含边界的k*k矩形内的各联通块的大小以及不含边界的k*k的矩形内的0的个数,然后边移动边开个桶更新。

 #include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
#include<math.h>
//#include<vector>
//#include<iostream>
using namespace std; int n,K;
#define maxn 511
char mp[maxn][maxn];
int id[maxn][maxn]; int ufs[maxn*maxn],size[maxn*maxn];
int find(int x) {return x==ufs[x]?x:(ufs[x]=find(ufs[x]));}
void Union(int x,int y) {x=find(x),y=find(y); if (x==y) return; size[y]+=size[x]; ufs[x]=y;} int bud[maxn*maxn]; bool vis[maxn][maxn];
int quex[maxn*maxn],quey[maxn*maxn],head,tail;
const int dx[]={,-,,},dy[]={,,,-};
void bfs(int x,int y)
{
vis[x][y]=; int ff=id[x][y];
head=; tail=; quex[]=x; quey[]=y;
while (head!=tail)
{
const int xx=quex[head],yy=quey[head]; head++;
for (int i=;i<;i++)
{
int nx=xx+dx[i],ny=yy+dy[i];
if (nx< || nx>n || ny< || ny>n || vis[nx][ny] || mp[nx][ny]!='.') continue;
vis[nx][ny]=; quex[tail]=nx; quey[tail]=ny; tail++;
int idid=id[nx][ny]; Union(idid,ff);
}
}
} void insert(int x,int y,int &tot)
{
int now=id[x][y],ff=find(now);
if (!bud[ff]) tot+=size[ff]; bud[ff]++;
}
void Delete(int x,int y,int &tot)
{
int now=id[x][y],ff=find(now);
bud[ff]--; if (!bud[ff]) tot-=size[ff];
}
int main()
{
scanf("%d%d",&n,&K);
for (int i=;i<=n;i++) scanf("%s",mp[i]+);
for (int i=,tot=;i<=n;i++)
for (int j=;j<=n;j++)
id[i][j]=++tot;
for (int i=;i<=n*n;i++) ufs[i]=i,size[i]=; for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
if (mp[i][j]=='.' && !vis[i][j]) bfs(i,j);
int ans=;
for (int i=K;i<=n;i++)
{
memset(bud,,sizeof(bud));
int tot=,xx=;
for (int j=i-K+;j<=i;j++)
for (int k=;k<=K;k++) if (mp[j][k]=='.') insert(j,k,tot);
else xx++;
if (K<n) for (int j=i-K+;j<=i;j++) if (mp[j][K+]=='.') insert(j,K+,tot);
if (i>K) for (int k=;k<=K;k++) if (mp[i-K][k]=='.') insert(i-K,k,tot);
if (i<n) for (int k=;k<=K;k++) if (mp[i+][k]=='.') insert(i+,k,tot);
ans=max(ans,tot+xx); for (int k=K+;k<=n;k++)
{
for (int j=i-K+;j<=i;j++) xx-=(mp[j][k-K]=='X');
for (int j=i-K+;j<=i;j++) xx+=(mp[j][k]=='X');
if (k>K+) for (int j=i-K+;j<=i;j++) if (mp[j][k-K-]=='.') Delete(j,k-K-,tot);
if (k<n) for (int j=i-K+;j<=i;j++) if (mp[j][k+]=='.') insert(j,k+,tot);
if (i>K)
{
if (mp[i-K][k]=='.') insert(i-K,k,tot);
if (mp[i-K][k-K]=='.') Delete(i-K,k-K,tot);
}
if (i<n)
{
if (mp[i+][k]=='.') insert(i+,k,tot);
if (mp[i+][k-K]=='.') Delete(i+,k-K,tot);
}
ans=max(ans,tot+xx);
// cout<<i<<' '<<k<<' '<<tot<<' '<<xx<<endl;
}
}
printf("%d\n",ans);
return ;
}

Codeforces679C. Bear and Square Grid的更多相关文章

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

  2. Codeforces 679C Bear and Square Grid

    Bear and Square Grid 枚举k * k 的位置, 然后接上它周围白色连通块的数量, 再统计完全在k * k范围里的连通块, 这个只要某个连通块全部的方格 在k * k里面就好, 并且 ...

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

  4. codeforces 680E Bear and Square Grid 巧妙暴力

    这个题是个想法题 先预处理连通块,然后需要用到一种巧妙暴力,即0变1,1变0,一列列添加删除 复杂度O(n^3) #include <cstdio> #include <iostre ...

  5. CF679C(Bear and Square Grid) 经典好题

    题目链接:传送门 题目大意:给你一个n*n包含".","X"的图,你有一次机会选择一个k*k的子矩阵,将子矩阵全部变为".",问当操作过后, ...

  6. Codeforces Round #356 (Div. 2)

    A. Bear and Five Cards time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  7. uva 11520 - Fill the Square

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  8. いろはちゃんとマス目 / Iroha and a Grid (组合数学)

    题目链接:http://abc042.contest.atcoder.jp/tasks/arc058_b Time limit : 2sec / Memory limit : 256MB Score ...

  9. 洛谷P2867 [USACO06NOV]大广场Big Square

    P2867 [USACO06NOV]大广场Big Square 题目描述 Farmer John's cows have entered into a competition with Farmer ...

随机推荐

  1. [转]F# Samples 101 - Visual Studio 2010

    http://code.msdn.microsoft.com/F-Samples-101-0576cb9f/sourcecode?fileId=18956&pathId=1045958806 ...

  2. P1433 吃奶酪

    题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处. 输入输出格式 输入格式: 第一行一个数n (n<=15) 接下来每行2个实数,表示第i块 ...

  3. Git ---创建和切换分支

    ······································································"天下武功,唯快不破" git分支: g ...

  4. jQuery.ajax() 设置 Headers 中的 Accept 内容

    jQuery.ajax() 如何设置 Headers 中的 Accept 内容   其实很简单,首先如果是常见类型,则请直接设置 dataType 属性 $.ajax({ dataType: &quo ...

  5. [Windows Server 2008] 404错误设置方法

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:如何设置4 ...

  6. vultr服务器L2TP搭建

    前期准备,购买外服,选择vultr服务商,可选择洛杉矶的,系统为Ubuntu 14.04 x64 一.安装L2TP/IPSec wget --no-check-certificate https:// ...

  7. K近邻法(K-Nearest Neighbor,KNN)

    KNN是一种基本分类与回归方法,本篇只总结分类问题中的KNN. 输入:样本的特征向量,对应于特征空间中的点 输出:样本的类别,可取多类 算法思想:给定一个样本类别已知的训练数据集,对于新样本,根据其K ...

  8. Winform窗体验证登陆

    用户名,密码尽量不要在BLL,UIL判断,尽可能的在储存过程判断,通过返回的值不同,进行判断,这样提高安全性SQL Server储存过程代码: BEGINif(exists ( select User ...

  9. jQuery 点击 星星评分

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 安装gitlab并配置邮箱

    安装要求:运行内存必须大于等于2G 一.安装docker wget -qO- https://get.docker.com/ | sh 镜像加速: echo '{"registry-mirr ...