我是题面

这道题跟理想的正方形很像,不大明白蛤OI是怎么想的,一年出两道这么相近的题

这道题有两个矩形,所以就有了两种做法(说是两种做法,其实只是维护的矩形不同)

一种是维护大矩形,一种是维护小矩形,我这里采取了维护小矩形的方法

先求出以\((i,j)\)为左上角的大矩形和小矩形的权值和为多少,然后用单调队列维护以(i,j)为左上角的大矩形里能放得最小的小矩形是哪个,最后做差得答案即可

下面是代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cctype>
#define ll long long
#define gc getchar
#define maxn 1005
using namespace std; inline ll read(){
ll a=0;int f=0;char p=gc();
while(!isdigit(p)){f|=p=='-';p=gc();}
while(isdigit(p)){a=(a<<3)+(a<<1)+(p^48);p=gc();}
return f?-a:a;
}int n,m,a,b,c,d,ans,w[maxn][maxn];
int w1[maxn][maxn],w2[maxn][maxn],x[maxn][maxn],y[maxn][maxn]; struct ahaha{
int s,id;
}q[maxn];int h,t; int main(){
n=read();m=read();a=read();b=read();c=read();d=read();
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
w[i][j]=w[i-1][j]+w[i][j-1]+read()-w[i-1][j-1];
for(int i=1;i<=n-c+1;++i)
for(int j=1;j<=m-d+1;++j){
w1[i][j]=w[i+c-1][j+d-1]-w[i+c-1][j-1]-w[i-1][j+d-1]+w[i-1][j-1];
if(i<=n-a+1&&j<=m-b+1)
w2[i][j]=w[i+a-1][j+b-1]-w[i+a-1][j-1]-w[i-1][j+b-1]+w[i-1][j-1];
}
for(int i=1;i<=n-c+1;++i){
int l=b-d+1;
for(int j=1;j<l;++j){
while(h<=t&&w1[i][j]<=q[t].s)--t;
q[++t]={w1[i][j],j};
}
for(int j=l;j<=m-d+1;++j){
while(h<=t&&j-q[h].id>=l-1)++h;
x[i][j-l+1]=q[h].s;
while(h<=t&&w1[i][j]<=q[t].s)--t;
q[++t]={w1[i][j],j};
}
h=1,t=0;
}
for(int i=1;i<=m-b+1;++i){
int l=a-c+1;
for(int j=1;j<l;++j){
while(h<=t&&x[j][i]<=q[t].s)--t;
q[++t]={x[j][i],j};
}
for(int j=l;j<=n-c+1;++j){
while(h<=t&&j-q[h].id>=l-1)++h;
y[j-l+1][i]=q[h].s;
while(h<=t&&x[j][i]<=q[t].s)--t;
q[++t]={x[j][i],j};
}
h=1,t=0;
}
for(int i=1;i<=n-a+1;++i)
for(int j=1;j<=m-b+1;++j)
ans=max(ans,w2[i][j]-y[i][j]);
printf("%d\n",ans);
return 0;
}

P2219 [HAOI2007]修筑绿化带的更多相关文章

  1. P2219 [HAOI2007]修筑绿化带(单调队列)

    P2219 [HAOI2007]修筑绿化带 二维单调队列 写了这题 P2216 [HAOI2007]理想的正方形  后,你发现可以搞个二维单调队列 来保存矩形(i+1,i+A-1)(j+1,j+B-1 ...

  2. 洛谷P2219 [HAOI2007]修筑绿化带(单调队列)

    传送门 啧……明明以前做到过这种类型的题结果全忘了…… 这种矩阵的,一般都是先枚举行,然后对列进行一遍单调队列,搞出右下角在每一行中合法位置时的最小权值 再枚举列,对行做一遍单调队列,用之前搞出来的最 ...

  3. 洛谷2219:[HAOI2007]修筑绿化带——题解

    https://www.luogu.org/problemnew/show/P2219#sub 为了增添公园的景致,现在需要在公园中修筑一个花坛,同时在画坛四周修建一片绿化带,让花坛被绿化带围起来. ...

  4. [HAOI2007] 修筑绿化带

    类型:单调队列 传送门:>Here< 题意:给出一个$M*N$的矩阵,每一个代表这一格土地的肥沃程度.现在要求修建一个$C*D$的矩形花坛,矩形绿化带的面积为$A*B$,要求花坛被包裹在绿 ...

  5. luogu2219 [HAOI2007]修筑绿化带

    和「理想的正方形」比较相似,需要先掌握那道题. 花坛外头每一边必须套上绿化带 #include <iostream> #include <cstdio> using names ...

  6. [luoguP2219] [HAOI2007]修筑绿化带(单调队列)

    传送门 需要n*m的算法,考虑单调队列 可以预处理出来 a[i][j]表示以i,j为右下角的绿化带+花坛的和 b[i][j]表示以i,j为右下角的花坛的和 那么我们可以单调队列跑出来在A-C-1,B- ...

  7. 洛谷.2219.[HAOI2007]修筑绿化带(单调队列)

    题目链接 洛谷 COGS.24 对于大的矩阵可以枚举:对于小的矩阵,需要在满足条件的区域求一个矩形和的最小值 预处理S2[i][j]表示以(i,j)为右下角的C\(*\)D的矩阵和, 然后对于求矩形区 ...

  8. luogu 2219[HAOI2007]修筑绿化带 单调队列

    Code: #include<bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in",& ...

  9. [HAOI2007]修筑绿化带 题解

    题意分析 给出一个 $m*n$ 的矩阵 $A$ ,要求从中选出一个 $a*b$ 的矩阵 $B$ ,再从矩阵 $B$ 中选出一个 $c*d$ 的矩阵 $C$ ,要求矩阵 $B,C$ 的边界不能重合,求矩 ...

随机推荐

  1. Vue实例 中的常用配置项

    创建Vue实例时,使用 new Vue ({//配置项}) 或者 组件定义中 export default {//配置项},所有的Vue组件都是Vue实例,并且接受相同的选项对象(一些根实例特有的选项 ...

  2. 算法设计:UNION-FIND算法实现

    在上周的算法设计课程中,我们学习了UNION-FIND算法,该算法用来对不相交集进行查询与合并操作,但任何优秀的算法都必须要用实际的代码来进行实现,接下来我们就来看看具体的代码实现 1. 不相关集数据 ...

  3. oracle数据库数据字典应用

    oracle数据字典 数据字典是由oracle服务器创建和维护的一组只读的系统表.数据字典分为两类:一是基表,二是数据字典视图. 数据字典视图包括用户名.用户权限.对象名.约束和审计等信息,是通过运行 ...

  4. FFmpeg+vs2013开发环境配置(windows)

    1.下载ffmpeg包(dll.include.lib)   https://ffmpeg.zeranoe.com/builds/         有3个版本:Static.Shared和Dev St ...

  5. RAID系列技术详解

    1.RAID 0 RAID 0是把n个物理磁盘虚拟成一个逻辑磁盘,即形成RAID 0的各个物理磁盘会组成一个逻辑上连续,物理上也连续的虚拟磁盘.一级磁盘控制器(指使用这个虚拟磁盘的控制器,如果某台主机 ...

  6. 【CentOS_7】安装nginx

    1,下载 [root@VM_0_7_centos local]# wget http://nginx.org/download/nginx-1.14.2.tar.gz ---- ::-- http:/ ...

  7. python3使用csv包,读写csv文件

    python操作csv,现在很多都用pandas包了,不过python还是有一个原始的包可以直接操作csv,或者excel的,下面举个例子说明csv读写csv文件的方法: import os impo ...

  8. 如何将office卸载干净

    我试了控制面板卸载office软件等方法,发现一直卸载不干净. 后发现这个office的官方链接,根据这个链接的步骤就很轻松的卸载好了. https://support.office.com/zh-c ...

  9. 感谢Thunder

    感谢Thunder团队中的每一位成员. 组长王航认真负责,是一个合格优秀的领导者与伙伴,老师布置的任务都会及时分配给每个人,对待每一项任务都认真严谨负责,了解每个成员的优势及强项. 成员李传康.宋雨. ...

  10. 20162328蔡文琛week08

    学号 20162328 <程序设计与数据结构>第X周学习总结 教材学习内容总结 错误和异常代表不常见的或不正确处理的对象. 抛出异常时输出的消息提供了方法调用栈的轨迹. 每个catch子句 ...