传送门

Examples
input 1
4 2
BWWW
WBBW
WBBW
WWWB
output 1
4
input 2
3 1
BWB
WWB
BWB
output 2
2
input 3
5 3
BWBBB
BWBBB
BBBBB
BBBBB
WBBBW
output 3
2
input 4
2 2
BW
WB
output 4
4
input 5
2 1
WW
WW
output 5
4
Note

In the first example, Gildong can click the cell(2,2), then the working screen becomes:

BWWW
WWWW
WWWW
WWWB

Then there are four white lines — the 2-nd and 3-rd row, and the 2-nd and 3-rd column.

In the second example, clicking the cell (2,3)makes the 2-nd row a white line.

In the third example, both the 2-nd column and 5-th row become white lines by clicking the cell (3,2).

题意:有一个n*n的格子,由'B'和'W'组成,B代表黑色,W代表白色。现在有一个k*k的橡皮擦,你可以选一个地方(i,j)(1≤i≤n-k+1,1≤j≤n-k+1)点击,它会将(i',j')(i≤i'≤i+k-1,j≤j'≤j+k-1)区域全部变为白色,若一行(列)全是W全是W那么这一行(列)就是一条白色的线。现在问你擦一次之后最多能有多少条线。

题解:我们可以利用前缀和统计每一行每一列有多少个黑格子,前缀和为0表示这一行(列)本来就是一条白线,可以算出初始白线的数量。然后我们一行行一列列判断从这个点开始往右(下)k个变成白色之后会不会增加一条线,再用前缀和记录前n行(列)一共能加几条线。最后枚举每一个可以点击的点看这个区间能增加多少白线更新ans。

代码:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 2e3 + ;
char s[N][N];
int r[N][N],c[N][N],rr[N][N],cc[N][N];
int main(){
int n,k;
scanf("%d%d",&n,&k);
for (int i = ; i <= n; i++)
scanf("%s",s[i]+);
for (int i = ; i <= n; i++) {
for (int j = ; j <= n; j++) {
r[i][j] = r[i][j-]+(s[i][j]=='B');
c[i][j] = c[i][j-]+(s[j][i]=='B');
}
}
int tot = ;
for (int i = ; i <= n; i++)
tot+=(r[i][n] == ) + (c[i][n] == );
for (int i = ; i <= n; i++) {
for (int j = ; j <= n-k+; j++) {
rr[i][j] = rr[i-][j] + (r[i][j+k-] - r[i][j-] == r[i][n] && r[i][n]);
cc[i][j] = cc[i-][j] + (c[i][j+k-] - c[i][j-] == c[i][n] && c[i][n]);
}
}
int ans = tot;
for (int i = ; i <= n-k+; i++)
for (int j = ; j <= n-k+; j++)
ans = max(ans,tot+rr[i+k-][j]-rr[i-][j]+cc[j+k-][i]-cc[j-][i]);
printf("%d\n", ans);
return ;
}

CF1200D White Lines | 前缀和的更多相关文章

  1. D. White Lines

    D. White Lines 给定一个$n\times n$的$WB$矩阵,给定一个$k*k$的能把$B$变成$W$的橡皮擦,求橡皮擦作用一次后,全为$W$的行.列总数最大值 前缀和差分 #inclu ...

  2. White Lines

    D. White Lines 主要思路就是利用差分 对于行:如果在某一个点上,向右下角涂掉 k*k 的矩形能够使得新出现一行 "B" 那么就在这个点上 +1(这里的加 +1 需要利 ...

  3. CodeForces 1200D White Lines

    cf题面 Time limit 1500 ms Memory limit 262144 kB 解题思路 官方题解 1200D - White Lines Let's consider a single ...

  4. CF1200D 【White Lines】

    退役快一年了之后又打了场紧张刺激的$CF$(斜眼笑) 然后发现$D$题和题解里的大众做法不太一样 (思路清奇) 题意不再赘述,我们可以看到这个题~~好做~~在只有一次擦除机会,尝试以此为突破口解决问题 ...

  5. codeforce D. White Lines

    二维前缀和 给你一个n*n的矩阵,里面有两种字符,‘W’和‘B’,代表black 和white .其实这个矩阵就是一个方形画板,你有一个k*k的橡皮只能用一次,使k*k的矩阵里的B变成W,问完全空白的 ...

  6. cf1200 D White Lines(二维差分)

    题目大意 有一个大小为n的矩阵,每个1*1的单位为黑或白,我们可以用一个(只有一个)大小为k*k的白色矩阵覆盖,问:最多的时候有几条白线(横的全为白 或竖的全为白 即为白线). 思路 要想把一条线(以 ...

  7. Codeforces Round #578 (Div. 2)

    Codeforces Round #578 (Div. 2) 传送门 A. Hotelier 暴力即可. Code #include <bits/stdc++.h> using names ...

  8. PHP7函数大全(4553个函数)

    转载来自: http://www.infocool.net/kb/PHP/201607/168683.html a 函数 说明 abs 绝对值 acos 反余弦 acosh 反双曲余弦 addcsla ...

  9. Xamarin Studio在Mac环境下的配置和Xamarin.iOS常用控件的示例

    看过好多帖子都是Win环境装XS,Mac只是个模拟器,讲解在Mac环境下如何配置Xamarin Studio很少,也是一点点找资料,东拼西凑才把Xamarin Studio装在Mac上跑起来,如下: ...

随机推荐

  1. 【原生JS】自动渐变轮播

    渐变主要是通过CSS3的动画实现. 只需给css中添加transtion动画时间加上JS设置指定图片透明度显示与消失即可实现渐变过程. 效果图: HTML: <!DOCTYPE html> ...

  2. Vue 循环为选中的li列表添加效果

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>Vu ...

  3. Python--day38--进程同步控制的---锁\信号量\事件的方法名

  4. H3C 静态路由配置

  5. element-ui tree 根据不同叶子节点设置是否显示复选框

    公司业务要求不同根节点配置显示与否复选框,官方文档没有这样的配置,所以想到了修改element-ui源码. 1.这里将“node_modules\element-ui\packages”下的tree文 ...

  6. H3C通过端口ID决定端口角色

  7. Linux 内核 PCI 总线

    任何在 PCI 总线上的设备有参数 name 和 SUBSYSTEM 环境变量设置为值 pci. PCI 子系 统也一直添加下面 4 个环境变量: PCI_CLASS 设备的 PCI 类号, 16 进 ...

  8. 关于git命令

    1在自己电脑上生成一个密钥然后给老大,老大在github上设置后,你这台电脑才可以访问他的项目ssh-keygen -t rsa -C <邮件名称> ------->获取秘钥 cat ...

  9. vue-learning:24 - component - 目录

    component 组件 组件的概念 Vue 组件同时也都是 Vue 实例,可接受相同的选项对象option (除了一些根级特有的选项) 和使用相同的生命周期钩子,以及模板调用方式. 组件的构建和注册 ...

  10. 【Docker】Ubuntu16.04将Docker升级至最新版

    1.使用curl升级到最新版 curl -fsSL https://get.docker.com/ | sh 2.重启Docker sudo systemctl restart docker 3.设置 ...