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$ 的边界不能重合,求矩 ...
随机推荐
- SaltStack 安装配置 centos7
参考文档 http://docs.saltstack.cn/contents.html 快速安装 初始配置 控制端master配置 # vim /etc/salt/master interface: ...
- cocos2d-x JS 加载播放Studio帧动画的两种方法
昨天懵逼的搞了两个多小时(百度无果/没看出什么矛头),自己琢磨总算搞出来了 1. var levelUpJson = ccs.load("res/LevelUp.json") ...
- linux 小笔记
//强杀pid2306的进程 kill -9 2306 //查看80端口占用情况 lsof -i :80 //杀死mysql的所有进程 sudo killall mysqld //关闭占用80端口的所 ...
- Hibernate框架的第四天
## Hibernate框架的第四天 ## ---------- **回顾:Hibernate框架的第三天** 1. 一对多关联关系映射 * JavaBean的编写 * 编写映射的配置文件 * 使用级 ...
- MyBatis基础入门《八》查询参数传入Map
MyBatis基础入门<八>查询参数传入Map 描述: 在执行select查询数据的时候,方法传入的参数是java.util.Map类型. 接口方法: xml文件 注意: 书写SQL语句的 ...
- python入门第一篇
python里面 单行注释用:#被注释内容 多行注释用:"""被注释内容""" 要想py2.7和py3.5都能运行,必须在文件头部加: #/ ...
- Unity shader学习之屏幕后期处理效果之Bloom效果
Bloom特效是游戏中常见的一种屏幕效果.这种特效可以模拟真实摄像机的一种图像效果,它让画面中较亮的区域“扩散”到周围的区域中,造成一种朦胧的效果. Bloom的实现原理很简单,首先根据一个阈值提取出 ...
- Usefull Resources
Sql Server Profiler 1. http://www.cnblogs.com/Fooo/archive/2013/02/19/2916789.html 2. http://5439255 ...
- Debug常用命令
R命令 查看.修改CPU中寄存器的值 -r ;查看寄存器的值 -r cs ;修改cs寄存器的值 D命令 查看内存中的内容 ;d 段地址:偏移地址 -d 1000:01 ;查看内存100001处的内容 ...
- QT自定义消息
1.派生QAbstractNativeEventFilter,重写nativeEventFilter()函数 #ifndef CMYMESSAGEHANDLER_H #define CMYMESSAG ...