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. VS Code 设置取消打开文件目录的自动定位跟踪功能。

    文件-->首选项-->设置-->在搜索栏中搜索:explorer.autoReveal;    去掉勾选即可.

  2. android v7包的关联

    最近在使用到侧滑栏的时候,使用到了v7包下的actionbar,结果折腾了好久才折腾好,其实很简单的,操作步骤如下: 1. 在eclipse中导入v7包的工程 2. 在自己的工程中打开properti ...

  3. Android图片压缩,不失真,上线项目

    当然了,图片压缩是利用了libjpeg库的基础上,牛逼的同学可以自行生成so.jar.在此给出一个链接: http://www.cnblogs.com/hrlnw/p/4403334.html 在生成 ...

  4. filter 过滤器加载流程

    过滤器例子 <!--A过滤器--><filter> <filter-name>mdamptRightLimitFilter</filter-name> ...

  5. Array和ArrayList之间的区别

    . Array类型的变量在声明的同时必须进行实例化(至少得初始化数组的大小),而ArrayList可以只是先声明. . Array只能存储同构的对象,而ArrayList可以存储异构的对象. 同构的对 ...

  6. [Tunny]Grunt基础介绍

    [黄映焜/Tunny,20140711] Grunt是一个JavaScript任务管理器,对于需要反复重复的任务,例如压缩.编译.单元测试.代码检查等,自动化工具可以减轻你的劳动,简化你的工作. 本文 ...

  7. 源代码管理git的使用

    Git ----本地仓库---- 1.新建一个“本地仓库” git init 2.配置仓库 ①告诉git你是谁 git config user.name syl ②告诉git怎么联系你 git con ...

  8. 常用css属性拓展

    text-overflow:clip | ellipsis(默认值:clip)clip:当内联内容溢出块容器时,将溢出部分裁切掉.ellipsis:当内联内容溢出块容器时,将溢出部分替换为(...). ...

  9. 基于ANGULAR.JS的下一代WEB应用开发-01-yeoman

    Angularjs 个人认为这是一款很好的框架!它将我们从AJAX应用的开发中解救了出来!嗯....废话就说道这里下面我们开始把! 首先我们必须了解一些核心的概念: 客户端模版 MVC 数据绑定 依赖 ...

  10. LeetCode887鸡蛋掉落——dp

    题目 题目链接 你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N  共有 N 层楼的建筑.每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去,如果没有碎可以继续使用.你知道存在楼层 F , ...