题目链接:传送门

题目大意:给你一个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. 解疑 Numpy 中的 transpose(转置)和swapaxes(两个轴转置变换)

    1.一维和二维数据 .T等同于.transopse 2.三维及更多维数据 对于 z 轴 与 x 轴的变换 In [40]: arr = np.arange(16).reshape((2, 2, 4)) ...

  2. HTML5学习笔记3 内联SVG

    HTML5支持内联SVG 下面来介绍一下什么是SVG SVG可缩放矢量图形 可缩放矢量是基于可扩展标记语言(标准通用语言的子集),用于描述二维矢量图形的一种图形格式.它由万维网联盟制定,是一个开放标准 ...

  3. C#定时任务的偷懒实现

    通常会有些定时任务的工作,例如每分钟统计一下xxx用户的xxx数量 或者 定时拉取下数据 之类的任务. 通常要实现定时调度功能和控制线程是否可以并发执行. 所以通常一个简单的小项目搞成大项目,但是使用 ...

  4. app中h5交互的一些坑 记录笔记

    1.ios开发镶嵌 h5页面 存在input 圆角问题(安卓直角) 解决办法 inpput{ -webkit-appearance: none; border-radius: 0px; } 2.ios ...

  5. [Oracle] enq: TX - row lock contention 优化案例

    依据开发反馈.近期每天早上7:30应用会报警.应用的日志显示数据库连接池满了.新的连接被拒绝. 首先.我做了ASH报告(报告区间:7:25 ~ 7:35),从ASH的等待事件发现enq: TX - r ...

  6. mysql 添加缓存

    解决方法一,修改my.ini文件 找到 query_cache_size  =0 估计就是这个问题在造成的,没有开查询缓存 (一般1G 就64M缓存) 我的服务器的内存4G, 调整到  代码如下 复制 ...

  7. 多线程-Executor,Executors,ExecutorService,ScheduledExecutorService,AbstractExecutorService

    引用 系统启动一个新线程的成本是比较高的,因为涉及与操作系统交互.使用线程池可以很好地提高性能,尤其是当程序中需要创建大量生存期很短的线程时,更应该考虑使用线程池.线程池在系统启动时即创建大量空闲的线 ...

  8. ArrayList 和 HashMap 的默认大小是多数?

    ArrayList 和 HashMap 的默认大小是多数? 在 Java 7 中,ArrayList 的默认大小是 10 个元素,HashMap 的默认大小是16个元素(必须是2的幂).这就是 Jav ...

  9. vim插件管理器的安装和配置-windows

    # vim插件管理器的安装和配置-windows ### 前言------------------------------ vim做一框功能强大的编辑器,扩展功能令人称奇,插件机制非常灵活- 本篇推荐 ...

  10. ExtFormReturn,ext

    package cn.edu.hbcf.common.vo; public class ExtFormReturn { /** * 是否成功 */ private boolean success; / ...