P2219 [HAOI2007]修筑绿化带(单调队列)
二维单调队列
写了这题 P2216 [HAOI2007]理想的正方形 后,你发现可以搞个二维单调队列
来保存矩形(i+1,i+A-1)(j+1,j+B-1)内矩形C*D的最小值
具体怎么搞呢
先搞出二维前缀和
蓝后先按$x$轴跑一遍单调队列,再按$y$轴跑一遍就好辣
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
inline int Max(int a,int b){return a>b?a:b;}
#define N 1005
int n,m,A,B,C,D,s[N][N],h[N],L,R,ans;
int w1[N][N],w2[N][N],a1[N][N],a2[N][N];
int main(){
scanf("%d%d%d%d%d%d",&n,&m,&A,&B,&C,&D);
register int i,j;
for(i=;i<=n;++i)
for(j=;j<=m;++j){
scanf("%d",&s[i][j]);
s[i][j]+=s[i-][j]+s[i][j-]-s[i-][j-];
}//前缀和
for(i=A;i<=n;++i)
for(j=B;j<=m;++j)
w1[i][j]=s[i][j]-s[i-A][j]-s[i][j-B]+s[i-A][j-B];//A*B矩阵的和
for(i=C+;i<n;++i)
for(j=D+;j<m;++j)
w2[i][j]=s[i][j]-s[i-C][j]-s[i][j-D]+s[i-C][j-D];//C*D矩阵的和
for(i=C+;i<n;++i){
L=,R=;
for(j=D+;j<m;++j){
while(L<=R&&h[L]<j-B++D) ++L;
while(L<=R&&w2[i][h[R]]>=w2[i][j]) --R;
h[++R]=j;
a1[i][j]=w2[i][h[L]];
}
}//先处理出x轴上的最小值
for(j=D+;j<m;++j){
L=,R=;
for(i=C+;i<n;++i){
while(L<=R&&h[L]<i-A++C) ++L;
while(L<=R&&a1[h[R]][j]>=a1[i][j]) --R;
h[++R]=i;
a2[i][j]=a1[h[L]][j];
}
}//再按y轴跑一遍单调队列
for(i=A;i<=n;++i)
for(j=B;j<=m;++j)
ans=Max(ans,w1[i][j]-a2[i-][j-]);//取最小的C*D矩阵的值
printf("%d",ans);
return ;
}
P2219 [HAOI2007]修筑绿化带(单调队列)的更多相关文章
- 洛谷.2219.[HAOI2007]修筑绿化带(单调队列)
题目链接 洛谷 COGS.24 对于大的矩阵可以枚举:对于小的矩阵,需要在满足条件的区域求一个矩形和的最小值 预处理S2[i][j]表示以(i,j)为右下角的C\(*\)D的矩阵和, 然后对于求矩形区 ...
- luogu 2219[HAOI2007]修筑绿化带 单调队列
Code: #include<bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in",& ...
- 洛谷P2219 [HAOI2007]修筑绿化带(单调队列)
传送门 啧……明明以前做到过这种类型的题结果全忘了…… 这种矩阵的,一般都是先枚举行,然后对列进行一遍单调队列,搞出右下角在每一行中合法位置时的最小权值 再枚举列,对行做一遍单调队列,用之前搞出来的最 ...
- P2219 [HAOI2007]修筑绿化带
我是题面 这道题跟理想的正方形很像,不大明白蛤OI是怎么想的,一年出两道这么相近的题 这道题有两个矩形,所以就有了两种做法(说是两种做法,其实只是维护的矩形不同) 一种是维护大矩形,一种是维护小矩形, ...
- [luoguP2219] [HAOI2007]修筑绿化带(单调队列)
传送门 需要n*m的算法,考虑单调队列 可以预处理出来 a[i][j]表示以i,j为右下角的绿化带+花坛的和 b[i][j]表示以i,j为右下角的花坛的和 那么我们可以单调队列跑出来在A-C-1,B- ...
- 洛谷2219:[HAOI2007]修筑绿化带——题解
https://www.luogu.org/problemnew/show/P2219#sub 为了增添公园的景致,现在需要在公园中修筑一个花坛,同时在画坛四周修建一片绿化带,让花坛被绿化带围起来. ...
- [HAOI2007] 修筑绿化带
类型:单调队列 传送门:>Here< 题意:给出一个$M*N$的矩阵,每一个代表这一格土地的肥沃程度.现在要求修建一个$C*D$的矩形花坛,矩形绿化带的面积为$A*B$,要求花坛被包裹在绿 ...
- luogu2219 [HAOI2007]修筑绿化带
和「理想的正方形」比较相似,需要先掌握那道题. 花坛外头每一边必须套上绿化带 #include <iostream> #include <cstdio> using names ...
- [HAOI2007]修筑绿化带 题解
题意分析 给出一个 $m*n$ 的矩阵 $A$ ,要求从中选出一个 $a*b$ 的矩阵 $B$ ,再从矩阵 $B$ 中选出一个 $c*d$ 的矩阵 $C$ ,要求矩阵 $B,C$ 的边界不能重合,求矩 ...
随机推荐
- 新手解读JSP
一.解读简单JSP代码(承接上篇文章中的代码) 1. <%@ page language="java" contentType="text/html; charse ...
- python while for else
python的循环挺有意思 while和for体中可以带上else项 while中的else表示循环条件不成立时,去执行一次,也就是退出循环前去做一次 for中的else表示固定循环正常完成后,去执行 ...
- 多线程:QueueUserWorkItem引发的闭包与变量共享
//1. public void SaveModel(testmodel msg) { ThreadPool.QueueUserWorkItem(new WaitCallback(SaveModelT ...
- cocos2d JS 鼠标响应事件
对于PC和超级本,添加鼠标事件的的处理,可以加强用户的体验,其处理逻辑与触摸事件基本一样,多了一些鼠标特有的事件响应 如滚轮事件(onMouseScroll) cc.eventManager.addL ...
- shell编程:case语句
- web.xml文件的简单说明
在javaEE提供的tutorial中的hello1中的web.xml文件写到: <?xml version="1.0" encoding="UTF-8" ...
- 切记!pycharm向mysql数据库添加数据过程
python 导入包import requests 以爬取腾讯招聘网的招聘信息为例:(完整代码) import requestsfrom lxml import etreeimport pymys ...
- Installing IIS 8 on Windows Server 2012微软官方安装指导
from: https://www.iis.net/learn/get-started/whats-new-in-iis-8/installing-iis-8-on-windows-server-20 ...
- hadoop2.4.1 伪分布
最终的 /etc/profile :#在文件最后添加 # /etc/profile # System wide environment and startup program ...
- JS实例3
window.setInterval("Time()",1); function Time() { var date = new Date();//当前时间函数 var n = d ...