题意是需要求最大的扩散时间,最后输出的是一开始的火源点,那么我们比较容易想到的是二分找最大值,但是我们在这满足这样的点的时候可以发现,在当前扩散时间k下,以这个点为中心的(2k+1)2的正方形块内必须全部都是'X'才行,那么要访问这样的块内的'X'个数显然需要使用二维前缀和维护一下就可以O(1)求出个数,那么这部分问题我们解决,接下来就是二分的如何Check,那么既然我们之前找到了这样满足当期扩散时间的点后,我们只需要直接将这块矩形内部的点全部打标记,显然我们可以得知,如果当前扩散时间是满足要求的,那么所有的'X'最后都会被打上标记,那么我们可以利用这一性质,对满足这样的矩形进行二维差分,最后O(n*m)把标记推掉,在check一遍所有被打伤标记的点是不是等于等于一开始'X'的个数,若等于,那么我们可以将区间移至右边,否则移至左边。

最后记得不要用cin,cout,T的死去活来.....

 //      ——By DD_BOND 

 #include<bits/stdc++.h>

 using namespace std;

 typedef long long ll;

 const int MAXN=1e6+;

 inline ll sqr(ll x){ return x*x; }

 char s[MAXN];

 int main(void)
{
int n,m; scanf("%d%d",&n,&m);
vector<vector<int> >ok (n+,vector<int>(m+));
vector<vector<int> >sum(n+,vector<int>(m+));
vector<vector<int> >tmp(n+,vector<int>(m+));
for(int i=;i<=n;i++){
scanf("%s",s+);
for(int j=;j<=m;j++) if(s[j]=='X') sum[i][j]=;
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
sum[i][j]+=sum[i-][j]+sum[i][j-]-sum[i-][j-];
int l=,r=(min(n,m)-)/,res=;
while(l<=r){
int mid=(l+r)>>;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
tmp[i][j]=;
for(int i=mid+;i<=n-mid;i++)
for(int j=mid+;j<=m-mid;j++)
if(sum[i+mid][j+mid]-sum[i-mid-][j+mid]-sum[i+mid][j-mid-]+sum[i-mid-][j-mid-]==sqr(*mid+)){
tmp[i-mid][j-mid]+=;
tmp[i-mid][j+mid+]+=-;
tmp[i+mid+][j-mid]+=-;
tmp[i+mid+][j+mid+]+=;
}
int f=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
if(tmp[i][j]+=tmp[i-][j]+tmp[i][j-]-tmp[i-][j-])
f++;
if(f==sum[n][m]) l=mid+,res=mid;
else r=mid-;
}
printf("%d\n",res);
for(int i=res+;i<=n-res;i++)
for(int j=res+;j<=m-res;j++)
if(sum[i+res][j+res]-sum[i-res-][j+res]-sum[i+res][j-res-]+sum[i-res-][j-res-]==sqr(*res+))
ok[i][j]=;
for(int i=;i<=n;i++){
for(int j=;j<=m;j++) putchar((ok[i][j]?'X':'.'));
puts("");
}
return ;
}

Codeforces 1262E Arson In Berland Forest(二维前缀和+二维差分+二分)的更多相关文章

  1. E. Arson In Berland Forest(思维,找二维阵列中的矩阵,二分)

    题:https://codeforces.com/contest/1262/problem/E 分析:预处理出阵列中的矩阵,然后二分答案还原题目的烧火过程,判断是否满足要求 #include<b ...

  2. Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3) E. Arson In Berland Forest

    E. Arson In Berland Forest The Berland Forest can be represented as an infinite cell plane. Every ce ...

  3. Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3) E. Arson In Berland Forest 二分 前缀和

    E. Arson In Berland Forest The Berland Forest can be represented as an infinite cell plane. Every ce ...

  4. BZOJ1177 [Apio2009]Oil 二维前缀和 二维前缀最值

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1177 题意概括 在一个n*m的矩阵中,每一个位置一个数字. 现在让你选出3个k*k的矩阵,它们互不 ...

  5. Codeforces 835C - Star sky - [二维前缀和]

    题目链接:http://codeforces.com/problemset/problem/835/C 题意: 在天空上划定一个直角坐标系,有 $n$ 颗星星,每颗星星都有坐标 $(x_i,y_i)$ ...

  6. Codeforces 1080C 题解(思维+二维前缀和)

    题面 传送门 题目大意: 有一个黑白的棋盘,现在将棋盘上的一个子矩形全部染成黑色,另一个子矩形全部染成白色 求染完色后黑,白格子的总数 分析 我们可以发现,对于一个(1,1)到(x,y)的矩形,若xy ...

  7. C - Monitor CodeForces - 846D (二维前缀和 + 二分)

    Recently Luba bought a monitor. Monitor is a rectangular matrix of size n × m. But then she started ...

  8. openjudge1768 最大子矩阵[二维前缀和or递推|DP]

    总时间限制:  1000ms 内存限制:  65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如,如下4 * 4的 ...

  9. COGS1752 [BOI2007]摩基亚Mokia(CDQ分治 + 二维前缀和 + 线段树)

    题目这么说的: 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它 ...

随机推荐

  1. Python 字符串Ⅱ

    Python 字符串格式化 Python 支持格式化字符串的输出 .尽管这样可能会用到非常复杂的表达式,但最基本的用法是将一个值插入到一个有字符串格式符 %s 的字符串中. 在 Python 中,字符 ...

  2. nmon监控使用

    1.上传nmon_linux_x86_64文件到服务器 2.修改文件权限chmod 775 nmon_linux_x86_64 3.压测时需要执行以下命令监控服务器./nmon_linux_x86_6 ...

  3. js判断条件为“假”的情况

    以下6种情况判断结果为"假": 1.false(布尔类型) 2.null(用于定义空的或者不存在的引用) 3.undefined(未定义) 4.0(数值0) 5.''(空字符串) ...

  4. SpringBoot配置文件优先级加载顺序

  5. 由于数据库 'XXX' 离线,无法打开该数据库。

    大家使用sql server 进行还原的时候可能会遇到: system.Data.SqlClient.SqlError:因为数据库正在使用,所以无法获得对数据库的独占访问权 这个错误 下面是有一个解决 ...

  6. IDEA中Springboot静态文件加载(热部署)

    Springboot项目静态文件加载 昨天写项目的时候碰到一个问题,就是静态文件css无法读取到项目中,我仔细思考了下,总结了下,可能有两个问题 1.页面未加载更新 这个可能性非常大,Chrome就是 ...

  7. 数据:ContentProvider类

    一个程序可以通过实现一个Content provider的抽象接口将自己的数据完全暴露出去,而且Content providers是以类似数据库中表的方式将数据暴露.   Content provid ...

  8. sublime安装完插件后出现的一些问题

    1.安装anaconda后代码前面出现小方框 解决办法:这是由于不符合PEP8代码规范,在空白地方右击,选择anaconda --> autoformat PEP8 Errors ,同时保证导入 ...

  9. [THUSC2017]大魔法师:线段树

    分析 在线段树上用\(4 \times 4\)的矩阵打标记. 代码 #include <bits/stdc++.h> #define rin(i,a,b) for(register int ...

  10. sqli-lab(15)

    要考四级了 翻译过来就是 基于时间的单引号盲注 0X01盲注 的了解 https://www.cnblogs.com/ldhbetter/p/9201840.html 这里写的清清楚楚 A 先拆解长度 ...