D. White Lines

主要思路就是利用差分

对于行:如果在某一个点上,向右下角涂掉 k*k 的矩形能够使得新出现一行 “B” 那么就在这个点上 +1(这里的加 +1 需要利用差分来完成)

列同理,如果有现成的空白行,记录一下即可,最后直接加上

代码:

// Created by CAD on 2019/8/12.
#include <bits/stdc++.h>
using namespace std;
using ll=long long; char g[2005][2005];
int a[2005][2005];
int b[2005][2005];
void dif(int x1,int y1,int x2,int y2)
{
a[x1][y1]++,a[x2][y2]++;
a[x1][y2]--,a[x2][y1]--;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n,k;cin>>n>>k;
int ok=0;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
cin>>g[i][j];
for(int i=1;i<=n;++i)
{
int maxn=0,minn=0;
for(int j=1;j<=n;++j)
{
if(g[i][j]=='B')
{
maxn=j;
if(!minn)
minn=j;
}
}
if(minn==0) ok++;
else if(maxn-minn+1<=k)
dif(max(0,i-k)+1,max(0,maxn-k)+1,i+1,minn+1);
}
for(int j=1;j<=n;++j)
{
int maxn=0,minn=0;
for(int i=1;i<=n;++i)
{
if(g[i][j]=='B')
{
maxn=i;
if(!minn) minn=i;
}
}
if(minn==0) ok++;
else if(maxn-minn+1<=k) dif(max(0,maxn-k)+1,max(0,j-k)+1,minn+1,j+1);
}
ll ans=0;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1];
ans=max(ans,1ll*a[i][j]+ok);
}
}
cout<<ans<<endl;
return 0;
}

最新文章

  1. WCF Binding
  2. SILVERLIGHT 应急卫生模拟演练项目之childwindow
  3. Python基础语法(二)
  4. JAVA内部类使用
  5. 主机头部分 www有和无是有区别的
  6. Constructing Roads--hdu1102
  7. 【Stackoverflow好问题】java在,如何推断阵列Array是否包括指定的值
  8. dockerfile编辑时常用的sed命令,用来修改配置文件。
  9. oracle坏块问题的处理
  10. sicp 习题
  11. 网络传输--UDP
  12. java动手动脑3
  13. JS学习笔记7_表单脚本
  14. Django(框架、模板)
  15. 交叉编译Python-2.7.13到ARM(aarch64)平台
  16. Windows7安装UBUNTU虚拟机
  17. 你所了解到的Web攻击技术
  18. easyui combobox下拉框复制后再禁用,点击不会出现下拉框
  19. SpringBoot ( 八 ) :RabbitMQ 详解
  20. 【EGit】The current branch is not configured for pull No value for key branch.master.merge found in config

热门文章

  1. CF387B 【George and Round】
  2. thinkphp6下无法获取header头中的Authorization(apache版)
  3. spring + dubbo 学习
  4. Mysql8.0安装与配置
  5. JavaScript冒泡排序法实现排序操作
  6. js截取字符串相关的知识点
  7. hashmap的hash方法源doc解读
  8. mac系统下Eclipse + pydev配置python Interpreter
  9. 关于Linux单机、集群部署FastDFS分布式文件系统的步骤。
  10. 排序——插入排序(C语言)