直接枚举每个点作为左上角是可以做的,但是写起来较麻烦

有一种较为简单的做法是对一列或一行统计贡献

比如某一行的B存在的区间是L,R那么就有三种情况

  1.没有这样的区间,即一行都是W,此时这行对答案的贡献一直是1

  2.R-L+1<=k,那么这一段必须要找一个点代表的矩形来覆盖,可以求出这样的点的存在区间是一个矩形,当且仅当点在这个矩形范围内时,这一行会有1的贡献、

  3.R-L+1>k,永远不会有贡献

对于情况2,我们用二维的差分来统计一下,最后枚举每个点,看我们选择这个点代表的矩形时,贡献是否达到最大就行

#include<bits/stdc++.h>
using namespace std;
#define N 2005
char mp[N][N];
int n,k,tot,l[N],r[N],u[N],d[N],cnt[N][N];
int main(){
cin>>n>>k;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
scanf("\n%c",&mp[i][j]); memset(l,0x3f,sizeof l);
memset(u,0x3f,sizeof u);
for(int i=;i<=n;i++){
for(int j=;j<=n;j++)
if(mp[i][j]=='B')
l[i]=min(l[i],j),r[i]=max(r[i],j);
if(l[i]==0x3f3f3f3f)
tot++;
else if(r[i]-l[i]+<=k){
int x1=max(,i-k+),y1=max(,r[i]-k+);
int x2=i,y2=l[i];
cnt[x1][y1]++;cnt[x1][y2+]--;
cnt[x2+][y1]--;cnt[x2+][y2+]++;
}
}
for(int j=;j<=n;j++){
for(int i=;i<=n;i++)
if(mp[i][j]=='B')
u[j]=min(u[j],i),d[j]=max(d[j],i);
if(u[j]==0x3f3f3f3f)
tot++;
else if(d[j]-u[j]+<=k){
int x1=max(,d[j]-k+),y1=max(,j-k+);
int x2=u[j],y2=j;
cnt[x1][y1]++;cnt[x1][y2+]--;
cnt[x2+][y1]--;cnt[x2+][y2+]++;
}
} int ans=;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++){
cnt[i][j]+=cnt[i-][j]+cnt[i][j-]-cnt[i-][j-];
ans=max(ans,cnt[i][j]);
}
cout<<ans+tot<<endl; }

二维差分前缀和——cf1202D(好题)的更多相关文章

  1. Codeforces 1262E Arson In Berland Forest(二维前缀和+二维差分+二分)

     题意是需要求最大的扩散时间,最后输出的是一开始的火源点,那么我们比较容易想到的是二分找最大值,但是我们在这满足这样的点的时候可以发现,在当前扩散时间k下,以这个点为中心的(2k+1)2的正方形块内必 ...

  2. 洛谷 P3397 地毯 【二维差分标记】

    题目背景 此题约为NOIP提高组Day2T1难度. 题目描述 在n*n的格子上有m个地毯. 给出这些地毯的信息,问每个点被多少个地毯覆盖. 输入输出格式 输入格式: 第一行,两个正整数n.m.意义如题 ...

  3. HDU - 6514 Monitor(二维差分)

    题意 给定一个\(n×m\)的矩阵.(\(n×m <= 1e7\)). \(p\)次操作,每次可以在这个矩阵中覆盖一个矩形. \(q\)次询问,每次问一个矩形区域中,是否所有的点都被覆盖. 解析 ...

  4. Monitor HDU6514 二维差分入门学习

    Monitor HDU 6514 二维差分入门学习 题意 小腾有\(n*m\)的田地,但是有小偷来偷东西,在一片矩形区域上,有一部分区域是监控可以覆盖到的,这部分区域由一个或多个包含于该矩形区域的小矩 ...

  5. Codeforces Round #578 (Div. 2) 二维差分 可做模板

    题意: 在n*n的矩阵中,你可以选择一个k*k的子矩阵,然后将这个子矩阵中的所有B全部变为W,问你怎么选择这个子矩阵使得最终的矩阵中某一行全是W或者某一列全是W的个数最多 题解:考虑每一行和每一列,对 ...

  6. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

  7. NOI 2012 魔幻棋盘 | 二维差分 + 二维线段树

    题目:luogu 2086 二维线段树,按套路差分原矩阵,gcd( x1, x2, ……, xn ) = gcd( xi , x2 - x1 , ……, xn - xn-1 ),必须要有一个原数 xi ...

  8. Gym 102028J 扫描线/二维差分 + 解方程

    题意:有一个二维平面,以及n个操作,每个操作会选择一个矩形,使得这个二维平面的一部分被覆盖.现在你可以取消其中的2个操作,问最少有多少块地方会被覆盖? 思路:官方题解简洁明了,就不细说了:https: ...

  9. 2020ICPC&#183;小米 网络选拔赛第一场 J.Matrix Subtraction (贪心,二维差分)

    题意:给一个\(nXm\)的矩阵,可以选取\(aXb\)的子矩阵,使子矩阵中的所有元素减一,问最后是否能使矩阵中所有元素变为\(0\). 题解:首先贪心,我们看最左上角的元素,如果\(g[1][1]\ ...

随机推荐

  1. Delphi 获取系统的语言环境参数GetSystemDefaultLangID、VerLanguageName、GetLocaleInfo

    1 核心的两个API函数:GetSystemDefaultLangID 和 VerLanguageName. GetSystemDefaultLangID:获得系统默认语言的ID VerLanguag ...

  2. Redis端口配置

    redis.host=192.168.200.128redis.port=6379redis.pass=redis.database=0redis.maxIdle=300redis.maxWait=3 ...

  3. apue 第10章 信号signal

    每种信号都有名字,都是以SIG开头 信号机制最简单的接口是signal函数 #include <signal.h> typedef void (*sighandler_t)(int); s ...

  4. PCB一些设置记录

    开始时设置原点,编辑>>原点>>设置 画PCB时,导入后,根据各个模块放好位置 设计>>类>>添加电源类 设计>>规则>>Cle ...

  5. 【Dart学习】--Dart之正则表达式相关方法总结

    一,部分属性 RegExp exp = new RegExp(r"(\w+)"); 返回正则表达式的哈希码 print(exp.hashCode); 正则表达式是否区分大小写 pr ...

  6. BZOJ 3653: 谈笑风生(主席树)

    传送门 解题思路 首先对于一个\(a\)来说,要求\(b\)和\(c\),那么\(a,b,c\)一定在一条链上.把\(b\)分类讨论,如果\(b\)是\(a\)的祖宗,这个方案数就很好统计了,就是\( ...

  7. Regex 正则零宽断言

    http://baike.baidu.com/link?url=sLfovpZmIcS5Uz_tiidXoVtjl30Tu3wARMfhnEcbgEGzsb8g1z7dvtGNXTulu1KDodmi ...

  8. Kali Linux下运行nfc工具测试!

    由于Kali本身就集成了很多nfc工具,用起来很方便,再加上一个acr122u读卡器,来尝试PJ学校水卡! 首先安装驱动,到龙杰官网下载Linux的,解压后进入自己Linux发行版,Kali的是Deb ...

  9. SPOJ_QTREE系列题解

    QTREE4 #pragma comment(linker, "/STACK:102400000,102400000") //#include<bits/stdc++.h&g ...

  10. #include <utility>

    #include <utility>这个头文件是什么用法 utility头文件定义了一个pair类型,是标准库的一部分,其原型为:template<class _Ty1, class ...