CF1200D 【White Lines】
退役快一年了之后又打了场紧张刺激的$CF$(斜眼笑)
然后发现$D$题和题解里的大众做法不太一样 (思路清奇)
题意不再赘述,我们可以看到这个题~~好做~~在只有一次擦除机会,尝试以此为突破口解决问题
我们考虑擦除某一行(列同理),分别记录这一行最左端和最右端的黑块位置(分别记为$l,r$)
这里存在以下三种情况:
1,这一行没有黑块,这时无论在哪擦除,这一行必然全白,记录答案后不再考虑
2,这一行的最左黑块和最右黑块之间的距离$>k$(即$r-l+1>k$),这时无论在哪擦除,这一行必然不会全白,不再考虑
3,这一行最左黑块和最右黑块之间的距离$<=k$,考虑能够使得这一行全为白色的擦除位置(假设我们当前考虑的是第$i$行)
容易得出,对于擦除位置的选择
可行的行:第$i-k+1((i-k+1)+k-1=i)$行到第$i$行
可行的列:第$l-k+1((l-k+1)+k-1=l)$列到第$l$列
即如果擦除位置$(x,y)$满足$i-k+1<=x<=i$且$l-k+1<=y<=l$,这一次擦除可以使第$i$行变白
对于答案统计,自然想到二维前缀和
我们只需在位置$(i-k+1,l-k+1),(i+1,l+1)+1$,$(i-k+1,l+1),(i+1,l-k+1)-1$即可(二维差分的常规操作)
差分完了再做前缀和即可得出答案(别忘了累加情况一的答案)
$P.S.i-k+1$和$l-k+1$不要数组越界
上代码:
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=;
int n,k,ans[maxn][maxn],l[][maxn],r[][maxn],res,bs;
bool exi[maxn][maxn];
int main()
{
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)
{
string s;
cin>>s;
for(int j=;j<n;j++)
if(s[j]=='W')
exi[i][j+]=;
else
exi[i][j+]=;
}
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
if(exi[i][j])
{
l[][i]=j;
break;
}
for(int j=n;j;j--)
if(exi[i][j])
{
r[][i]=j;
break;
}
if(!l[][i])
bs++;
}
for(int j=;j<=n;j++)
{
for(int i=;i<=n;i++)
if(exi[i][j])
{
l[][j]=i;
break;
}
for(int i=n;i;i--)
if(exi[i][j])
{
r[][j]=i;
break;
}
if(!l[][j])
bs++;
}
for(int i=;i<=n;i++)
{
if(l[][i]&&r[][i]-l[][i]+<=k)
{
int minx=max(i-k+,),miny=max(,r[][i]-k+);
ans[minx][miny]++;
ans[i+][miny]--;
ans[minx][l[][i]+]--;
ans[i+][l[][i]+]++;
}
if(l[][i]&&r[][i]-l[][i]+<=k)
{
int miny=max(i-k+,),minx=max(,r[][i]-k+);
ans[minx][miny]++;
ans[minx][i+]--;
ans[l[][i]+][miny]--;
ans[l[][i]+][i+]++;
}
}
for(int i=;i<=n-k+;i++)
for(int j=;j<=n-k+;j++)
{
ans[i][j]+=ans[i-][j]+ans[i][j-]-ans[i-][j-];
res=max(res,ans[i][j]);
}
printf("%d\n",res+bs);
return ;
}
CF1200D 【White Lines】的更多相关文章
- 题解 CF1216C 【White Sheet】
虽然也很水,但这道还是比前两道难多了... 题目大意:给你三个位于同一平面直角坐标系的矩形,询问你后两个是否完全覆盖了前一个 首先,最直观的想法应该是,把第一个矩形内部每个整数点检查一下,看看是否位于 ...
- CF1200D White Lines | 前缀和
传送门 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 ...
- 【MVC 4】7.SportsSore:完成购物车
作者:[美]Adam Freeman 来源:<精通ASP.NET MVC 4> 本文将继续构建 SportsStore 示例应用程序.在上一章中,添加了对购物车的基本支持,现在打 ...
- 【MVC 4】6.SportsSore:导航
作者:[美]Adam Freeman 来源:<精通ASP.NET MVC 4> 前面的文章[MVC 4]5.SportsSore —— 一个真实的应用程序 建立了 Sports ...
- 【29.89%】【codeforces 734D】Anton and Chess
time limit per test4 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【20.51%】【codeforces 610D】Vika and Segments
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 【Machine Learning】KNN算法虹膜图片识别
K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...
- 【深入浅出jQuery】源码浅析2--奇技淫巧
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- Python基础之【第一篇】
Python简介: python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语 ...
随机推荐
- python高级语法1
1.解压序列赋值给多个变量 p = (4, 5, 6) x, y , z = p # x = 4, y = 5, z = 6 若可迭代对象超过变量个数,会抛出ValueError 用处:可以解压赋值任 ...
- Java实现贪吃蛇游戏(含账号注册登录,排行榜功能)
这是我第一次工程实践的作业,选题很多,但我只对其中的游戏开发感兴趣,可游戏就两三个类型,最终还是选择了贪吃蛇.其实就贪吃蛇本身的代码实现还算是比较简单的,可是实践要求代码行达到一定数量,所以我就额外给 ...
- RDD源码分析
RDD源码解析 一. RDD.scala - Resilient Distributed Dataset (RDD) 弹性分布式数据集 弹性: 体现在计算上面 - the basic abstract ...
- 10.InfluxDB-InfluxQL基础语法教程--OFFSET 和SOFFSET子句
本文翻译自官网,官网地址:(https://docs.influxdata.com/influxdb/v1.7/query_language/data_exploration/) OFFSET 和SO ...
- python 环境配置的导入与导出
Python——配置环境的导出与导入 导出Python环境安装包[root@bogon ~]# pip freeze > packages.txt这将会创建一个 packages.txt文件 ...
- Jenkins 打tag回滚
利用jenkins,从gitlab上拉取代码,然后发布,如果想进行代码回退,其实还是代码发布,拉取的时候,选择合适的标签. 一.利用Git parameter插件选择branch或tag.下面的文本参 ...
- Python环境安装与基础语法(4)——内存管理、if分支
Python内存管理 python中有自动清理内存垃圾的功能,当变量的引用计数为0,则可以被有计划的垃圾回收GC 常量会在系统中被多次引用,所以常量的引用计数无法确定 程序控制 顺序:按照先后顺序逐条 ...
- computed和watch的用法和区别
computed可以监听v-model(data)中的值,只要值发生变化 他就会重新去计算 computed必须是要有一个返回值的哦 <div id="app"> &l ...
- Linux终端执行shell脚本,提示权限不够
在学习dubbo过程中,上传自己写的脚本,执行的时候提示“权限不够”,从网上了解到是因为没有为脚本赋权限 解决方法是使用chmod命令为shell脚本赋予权限 chmod 777 ./service- ...
- shell 字符菜单管理
1.创建一个脚本func.sh 脚本如下func2.sh #!/bin/bash function menu(){ title="My Menu" url="www.la ...