luogu 2219[HAOI2007]修筑绿化带 单调队列
Code:
#include<bits/stdc++.h>
using namespace std;
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 1002
#define inf 1000000000
deque<int>q;
int n,m,A,B,C,D;
int minv[maxn][maxn],sumv[maxn][maxn],val[maxn][maxn],tot[maxn][maxn];
int main()
{
// setIO("input");
scanf("%d%d%d%d%d%d",&n,&m,&A,&B,&C,&D);
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
scanf("%d",&sumv[i][j]);
sumv[i][j]+=(sumv[i][j-1]+sumv[i-1][j]-sumv[i-1][j-1]);
}
}
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
if(i>=A&&j>=B) tot[i][j]=sumv[i][j]-sumv[i-A][j]-sumv[i][j-B]+sumv[i-A][j-B];
if(i>=C&&j>=D) val[i][j]=sumv[i][j]-sumv[i-C][j]-sumv[i][j-D]+sumv[i-C][j-D];
}
}
for(int j=1;j<=m;++j)
{
while(!q.empty()) q.pop_front();
for(int i=2;i<=n;++i)
{
while(!q.empty()&&i-q.front()+1>=A-C) q.pop_front();
if(!val[i-1][j]) { minv[i][j]=inf; continue; }
while(!q.empty()&&val[i-1][j]<=val[q.back()][j]) q.pop_back();
q.push_back(i-1);
minv[i][j]=val[q.front()][j];
}
}
int ans=0;
for(int i=1;i<=n;++i)
{
while(!q.empty()) q.pop_front();
for(int j=2;j<=m;++j)
{
while(!q.empty()&&j-q.front()+1>=B-D) q.pop_front();
if(!val[i][j-1]) continue;
while(!q.empty()&&minv[i][j-1]<=minv[i][q.back()]) q.pop_back();
q.push_back(j-1);
ans=max(ans, tot[i][j]-minv[i][q.front()]);
}
}
printf("%d\n",ans);
return 0;
}
luogu 2219[HAOI2007]修筑绿化带 单调队列的更多相关文章
- 洛谷.2219.[HAOI2007]修筑绿化带(单调队列)
题目链接 洛谷 COGS.24 对于大的矩阵可以枚举:对于小的矩阵,需要在满足条件的区域求一个矩形和的最小值 预处理S2[i][j]表示以(i,j)为右下角的C\(*\)D的矩阵和, 然后对于求矩形区 ...
- P2219 [HAOI2007]修筑绿化带(单调队列)
P2219 [HAOI2007]修筑绿化带 二维单调队列 写了这题 P2216 [HAOI2007]理想的正方形 后,你发现可以搞个二维单调队列 来保存矩形(i+1,i+A-1)(j+1,j+B-1 ...
- [luoguP2219] [HAOI2007]修筑绿化带(单调队列)
传送门 需要n*m的算法,考虑单调队列 可以预处理出来 a[i][j]表示以i,j为右下角的绿化带+花坛的和 b[i][j]表示以i,j为右下角的花坛的和 那么我们可以单调队列跑出来在A-C-1,B- ...
- 【Luogu】P2219修筑绿化带(单调队列)
题目链接 这题各种边界判断恶心死人 就是单调队列在每行求出最小的.能装进A*B方块里的花坛 然后再在刚刚求出的那个东西里面跑一遍竖着的单调队列 然后……边界调了一小时 做完这题我深刻地感觉到我又强了 ...
- 洛谷P2219 [HAOI2007]修筑绿化带(单调队列)
传送门 啧……明明以前做到过这种类型的题结果全忘了…… 这种矩阵的,一般都是先枚举行,然后对列进行一遍单调队列,搞出右下角在每一行中合法位置时的最小权值 再枚举列,对行做一遍单调队列,用之前搞出来的最 ...
- 洛谷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 ...
- luogu 2216 理想的正方形 单调队列(其实没有DP)
#include<bits/stdc++.h> using namespace std; ; ; int a,b,n; int g[A][A],q[A][N],Q[A][N]; int h ...
随机推荐
- .net core 学习小结之 配置介绍(config)以及热更新
命令行的配置 var settings = new Dictionary<string, string>{ { "name","cyao"}, {& ...
- linux 正则表达式 使用grep命令
最常应用正则表达式命令是 awk sed grep [root@MongoDB ~]# cat mike.log I am mike! I like linux. I like play footba ...
- for语句与if语句嵌套的简单应用
1.循环语句 for(初始条件:循环条件:状态改变) { 循环体 } break为跳出循环,continue为结束此次循环. 2.死循环常用while语句 while(判断语句) { if(判断) { ...
- Spring框架 课程笔记
Spring框架 课程笔记 第1章 Spring概述 1.1 Spring概述 1) Spring是一个开源框架 2) Spring为简化企业级开发而生,使用Spring ...
- [LeetCode] 107. 二叉树的层次遍历 II
题目链接 : https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/ 题目描述: 给定一个二叉树,返回其节点值自底 ...
- ETL工具Kettle使用以及与Java整合实现数据清洗
本文主要讲述kettle的使用和与Java整合,具体下载与安装请自行百度! kettle有两种脚本方式:转换和工作,工作中可以添加转换.以下以转换为例. 1.新建一个转换, 2.在工作中经常用到的是表 ...
- 05-Django-session-admin
# session- 为了应对HTTP协议的无状态性- 用来保存用户比较敏感的信息- 属于request的一个属性- 常用操作: - request.session.get(key, defaultV ...
- Python 通过dmidecode获取Linux服务器硬件信息
通过 dmidecode 命令可以获取到 Linux 系统的包括 BIOS. CPU.内存等系统的硬件信息,这里使用 python 代码来通过调用 dmidecode 命令来获取 Linux 必要的系 ...
- How Does Caching Work in AFNetworking? : AFImageCache & NSUrlCache Explained
http://blog.originate.com/blog/2014/02/20/afimagecache-vs-nsurlcache/
- R语言 绘图——条形图可以将堆积条形图与百分比堆积条形图配合使用
在使用堆积条形图时候,新增一个百分比堆积条形图,可以加深读者印象. 封装一个function函数后只需要在调用的数据上改一下pos=‘fill’的代码即可.比较方便. 案例: # 封装函数 fun1& ...