题目链接:传送门

题目大意:给你一个n*n包含".","X"的图,你有一次机会选择一个k*k的子矩阵,将子矩阵全部变为".",问当操作过后,得到的最大联通子块包含的"."的数目是多少。

题目思路:其实这个题自己只想到了一个暴力的思路,当然TLE没商量,但实际上正确的想法就是先dfs预处理所有"."的联通块,之后的想法技巧性太强了,

         操作是模拟将子矩阵右移,直接暴力会TLE,而我们可以想到实际上移动的时候我们只需要删掉最左边的一列,加上最右边的一列就达到了移动的子矩阵的目的。

         当然这个题既考验想法又考验码力,但是自己太弱,参考了很多别人的代码。。。努力!

 #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <stack>
#include <cctype>
#include <queue>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <climits>
#define lson root<<1,l,mid
#define rson root<<1|1,mid+1,r
#define fi first
#define se second
#define ping(x,y) ((x-y)*(x-y))
#define mst(x,y) memset(x,y,sizeof(x))
#define mcp(x,y) memcpy(x,y,sizeof(y))
using namespace std;
#define gamma 0.5772156649015328606065120
#define MOD 1000000007
#define inf 0x3f3f3f3f
#define N 100005
#define maxn 20005
typedef pair<int,int> PII; int n,k,ans,all,cnt,temp;
char pic[][];
int vis[][];
int color[]; ///子块所含 "." 的数目
int sum[][]; ///二维前缀和,避免一个点重复计数
int vi[]; ///标记数组,记录联通块是否计数过 void dfs(int x,int y){
++temp;
vis[x][y]=cnt;
if(pic[x-][y]=='.'&&!vis[x-][y])dfs(x-,y);
if(pic[x+][y]=='.'&&!vis[x+][y])dfs(x+,y);
if(pic[x][y-]=='.'&&!vis[x][y-])dfs(x,y-);
if(pic[x][y+]=='.'&&!vis[x][y+])dfs(x,y+);
}
inline void del(int x,int y){ ///删点
if(!vis[x][y])return;
int t=vis[x][y];
--vi[t];
if(!vi[t])all-=color[t];
}
inline void ins(int x,int y){ ///加点
if(!vis[x][y])return;
int t=vis[x][y];
if(!vi[t])all+=color[t];
++vi[t];
}
inline int clac(int x,int y){
return sum[x+k-][y+k-]-sum[x+k-][y-]-sum[x-][y+k-]+sum[x-][y-];
}
int main(){
int i,j,group;
scanf("%d%d",&n,&k);
for(i=;i<=n;++i){
scanf("%s",pic[i]+);
for(j=;j<=n;++j){
sum[i][j]=sum[i-][j]+sum[i][j-]-sum[i-][j-];
if(pic[i][j]=='.')++sum[i][j];
} ///二维前缀和,新技能get
}
for(i=;i<=n;++i)for(j=;j<=n;++j)
if(pic[i][j]=='.'&&!vis[i][j]){
++cnt;
temp=;
dfs(i,j);
color[cnt]=temp;
}
for(i=;i<=n-k+;++i){
all=;mst(vi,);
for(j=i-;j<=k+i;++j){
for(int l=;l<=k;++l)
ins(j,l);
}
for(j=i;j<i+k;++j)ins(j,k+);
ans=max(ans,all+k*k-clac(i,));
for(j=;j<=n-k+;++j){
for(int l=i;l<i+k;++l){
del(l,j-);
ins(l,j+k);
}
del(i-,j-);del(i+k,j-);
ins(i-,j+k-);ins(i+k,j+k-);
ans=max(ans,all+k*k-clac(i,j));
}
}
printf("%d\n",ans);
return ;
}

CF679C(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. Codeforces679C. Bear and Square Grid

    n<=500,n*n的01矩阵,可以选择一个k*k的矩阵全变1,求最大1联通区域. 敢敢n^3..模拟k*k的矩阵的位置,从左到右扫的时候,每变一个位置只会引起边界的信息变化,就记含边界的k*k ...

  6. 经典算法题每日演练——第十七题 Dijkstra算法

    原文:经典算法题每日演练--第十七题 Dijkstra算法 或许在生活中,经常会碰到针对某一个问题,在众多的限制条件下,如何去寻找一个最优解?可能大家想到了很多诸如“线性规划”,“动态规划” 这些经典 ...

  7. 经典算法题每日演练——第十六题 Kruskal算法

    原文:经典算法题每日演练--第十六题 Kruskal算法 这篇我们看看第二种生成树的Kruskal算法,这个算法的魅力在于我们可以打一下算法和数据结构的组合拳,很有意思的. 一:思想 若存在M={0, ...

  8. 经典算法题每日演练——第十四题 Prim算法

    原文:经典算法题每日演练--第十四题 Prim算法 图论在数据结构中是非常有趣而复杂的,作为web码农的我,在实际开发中一直没有找到它的使用场景,不像树那样的频繁使用,不过还是准备 仔细的把图论全部过 ...

  9. 经典算法题每日演练——第十一题 Bitmap算法

    原文:经典算法题每日演练--第十一题 Bitmap算法 在所有具有性能优化的数据结构中,我想大家使用最多的就是hash表,是的,在具有定位查找上具有O(1)的常量时间,多么的简洁优美, 但是在特定的场 ...

随机推荐

  1. 【php】模板页面展示复选框已选中选项和数据

    写在最开始: 2)我们这里流程是编辑.修改 已经存储的数据. 1.[修改]功能页面: 2.代码:HTML <dt>民宿设施</dt> <dd><label&g ...

  2. mongodb安装的两条命令

    1. 安装 下载并安装,注意安装方式为custom,路径自定义(d:\chengxu\mongodb),安装成功后在mongodb文件夹下新建data文件夹(内新建db文件夹)和logs文件夹(内新建 ...

  3. Js日常笔记之变量删除

    在Javascript是可以使用delete来手动删除变量,通过这样的方法让GC来回收内存,但在JS中并不是所有的对象都可以被删除的 JS中通过 var\function 声明因含有DontDelet ...

  4. python selenium --一些常用方法

    · text  获取该元素的文本 · submit  提交表单 · get_attribute  获得属性值 text   用于获取元素的文本信息 下面把百度首页底部的声明打印输出 #coding=u ...

  5. AutoHotKey入门

    首先它要编译.ahk后缀的脚本才能执行.脚本里再写键盘触发监听之类的逻辑. 所以并非单单只是热键启动那么简单,可以组合出复杂的功能,甚至支持正则表达式 理论上扩展性比按键精灵差,易用性大大优于按键精灵 ...

  6. Atitit.执行cmd 命令行 php

    Atitit.执行cmd 命令行 php 1. 执行cmd 命令行,调用系统命令的基础 1 1.1. 实际执行模式 1 1.2. 空格的问题 1 1.3. 中文路径的问题,程序文件读取编码设置 1 1 ...

  7. Java中数据库连接的一些方法资料汇总

    Java中Connection方法笔记 http://www.cnblogs.com/bincoding/p/6554954.html ResultSet详解(转)  https://www.cnbl ...

  8. mysql only_full_group_by问题

    我的mysql出现了only_full_group_by问题,网上一堆处理方案! 主要两种 一种修改配置表my.ini 另一种通过指令,屏蔽当前链接的only_full_group_by报错!我想永久 ...

  9. ORACLE 存储过程实例 [备忘录]

    统计报表:用户登录量(平台点击量)每月月初定时任务统计前一个月的登陆次数.登陆账号数.账号总数. 使用存储过程把查询的值存储到表 RP_MONTH_CLICK 中. create or replace ...

  10. nginx vhosts rewrite 独立文件的方式出现

    [root@web01 /]# cat /app/server/nginx/conf/nginx.conf user www www; worker_processes ; error_log /ap ...