这题挺高能的,但是HAOI2007出两道单调队列+降维的题,而且几乎一样,这样真的好吗......

首先大体的思路。

假设我们已经知道了对每一个 A*B 的矩阵,被其包含的所有 C*D 矩阵的最小和。

那我们只需要枚举左上角,在 O(1) 计算更新最优解就行了。

考虑实现上述思路。

1:二为前缀和预处理,并将每一个 C*D 矩阵的和存在 c[i][j] 中,(i,j) 为该矩阵左上顶点坐标。

2:对数组 c[i][j] 求平面区间 (A-C-1)*(B-D-1) 的最小值存储在 d[i][j] 中。

3:枚举求解。

平面最值的处理方式与理想的正方形一题相同。

这里需要注意的是平面范围的确定,因为 C*D 矩阵要完全包含在 A*B 矩阵内,注意完全包含,可以得出上述平面间范围。

我觉得细节是比较多的,写的时候很小心,所以写完后提交一遍过也很激动。

如果不A的话估计又是无限期的调试......

// q.c#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>using namespace std;const int MAX=1000+10;int M,N,A,B,C,D,ans;
int a[MAX][MAX]; // 原数组.
int c[MAX][MAX]; // C*D矩阵和数组.
int d[MAX][MAX]; // C*D矩阵和在A*B内最小值数组.
int s[MAX][MAX]; // 前缀和数组.
int minx[MAX][MAX]; // C*D矩阵和在x方向区间最小值数组.int qMin[MAX],h,t,pos[MAX]; // 单调队列相关.
void reset() {memset(qMin,0,sizeof(qMin));memset(pos,0,sizeof(pos));h=1,t=0;
}
void insert(int x,int y,int z,int r) { // w[x][y]=r,z为行或列方向坐标.while(h<=t&&qMin[t]>=r) t--;qMin[++t]=r,pos[t]=z;
}int main() {freopen("parterre.in","r",stdin);freopen("parterre.out","w",stdout);scanf("%d%d%d%d%d%d",&M,&N,&A,&B,&C,&D);for(int i=1;i<=M;i++) for(int j=1;j<=N;j++) scanf("%d",&a[i][j]);for(int i=1;i<=M;i++) for(int j=1;j<=N;j++) // 求二维前缀和.s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];for(int i=1;i+C-1<=M;i++) for(int j=1;j+D-1<=N;j++) // 求C*D矩阵和.c[i][j]=s[i+C-1][j+D-1]-s[i-1][j+D-1]-s[i+C-1][j-1]+s[i-1][j-1];int xLen=A-C-1; // x方向最值的区间长度. (C*D矩阵完全包含在A*B矩阵内)int yLen=B-D-1; // y方向最值的区间长度. (C*D矩阵完全包含在A*B矩阵内)int xSide=M-C+1; // x的新边界. (对于C*D矩阵)int ySide=N-D+1; // y的新边界. (对于C*D矩阵)for(int i=1;i<=xSide;i++) { // 求每一行y方向长度为yLen区间最小值,以降维处理.reset();for(int j=1;j<=yLen;j++) { // 先入队yLen个元素.insert(i,j,j,c[i][j]);}for(int j=yLen+1;j<=ySide+1;j++) { // 边界区间是[ySide-yLen+1,ySide].minx[i][j-yLen]=qMin[h];if(j==ySide+1) break;insert(i,j,j,c[i][j]);if(pos[h]<=j-yLen) h++; // 不在区间范围内了.}}for(int j=1;j<=ySide;j++) { // 求每一列x方向长度为xLen区间最小值,此时minx已存储一维最值.reset();for(int i=1;i<=xLen;i++) {insert(i,j,i,minx[i][j]);}for(int i=xLen+1;i<=xSide+1;i++) { // 边界区间是[xSide-xLen+1,xSide].d[i-xLen][j]=qMin[h]; // 现在d已存储二维区间最值.if(i==xSide+1) break;insert(i,j,i,minx[i][j]);if(pos[h]<=i-xLen) h++;}}for(int i=1;i+A-1<=M;i++) { // 枚举左上顶点,O(1)得到该点最优值.for(int j=1;j+B-1<=N;j++) {int x=s[i+A-1][j+B-1]-s[i-1][j+B-1]-s[i+A-1][j-1]+s[i-1][j-1];ans=max(ans,x-d[i+1][j+1]);}}printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/qjs12/p/8796116.html

[HAOI2007] 修筑绿化带相关推荐

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

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

  2. 洛谷 P2219修筑绿化带 二维单调队列~

    题目链接:https://www.luogu.org/problem/P2219 emmm调了一个上午+中午,fan 题意:从N*M的中找到一个a*b的大矩形和减去a*b中的一个与之不重边界的c*d的 ...

  3. ZJOI2019一轮停课刷题记录

    Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...

  4. 10.12NOIP模拟赛

    T1 过路费 Floyd 题目: 跟所有人一样,农夫约翰以着宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生财之道.为了发财,他设置了一系列的规章制度,使得任何一只奶牛在农场中的道路行走,都要 ...

  5. Bzoj 1046: [HAOI2007]上升序列 二分,递推

    1046: [HAOI2007]上升序列 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3671  Solved: 1255 [Submit][St ...

  6. BZOJ 1046: [HAOI2007]上升序列(LIS)

    题目挺坑的..但是不难.先反向做一次最长下降子序列.然后得到了d(i),以i为起点的最长上升子序列,接下来贪心,得到字典序最小. ----------------------------------- ...

  7. [HAOI2007] 理想的正方形

    洛谷题目链接:[HAOI2007]理想的正方形 题目描述 有一个ab的整数组成的矩阵,现请你从中找出一个nn的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一行 ...

  8. bzoj1046[HAOI2007]上升序列

    1046[HAOI2007]上升序列 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 5497  Solved: 1915 [Submit][Stat ...

  9. BZOJ 1046: [HAOI2007]上升序列【贪心+二分状态+dp+递归】

    1046: [HAOI2007]上升序列 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4987  Solved: 1732 [Submit][St ...

  10. BZOJ(8) 1053: [HAOI2007]反素数ant

    1053: [HAOI2007]反素数ant Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4118  Solved: 2453 [Submit][ ...

最新文章

  1. 揭晓你所不了解的第三代测序技术
  2. SAP MM 公司间STO的BILLING输出报错 - Inbound partner profile does not exist –
  3. expandableListView 总结
  4. 湖北农商行计算机类笔试,2018湖北农商行招聘考试面试考多少分,才能进笔试?...
  5. python自动抓取论文_用python抓取某期刊最近5年发表的所有文章的关键词和摘要...
  6. 如何减少java里的分支_idea切换分支的时候,忽略一些无用的修改设置
  7. 【渝粤题库】陕西师范大学165111 薪酬管理 作业(高起专)
  8. Java Seckill Module:seckill
  9. 计算机中的字体无法删除,电脑安装的字体怎么删除不了怎么办啊
  10. BouncyCastle使用注意事项
  11. Win7 + ubuntu14.04 双系统
  12. 小米4降级android版本,小米MIUI不再允许降级,小心手机变砖
  13. 浅谈虚树(虚仙人掌)
  14. CNN基础网络(一)
  15. Vue + Spring Boot 项目实战(三):前后端结合测试(登录页面开发)
  16. 【ParaView教程】第四章 常见问题 —— 怎样计算正面投影面积?
  17. 关于液晶显示器的6bit面板、8bit面板及E-IPS(转)
  18. Ubuntu16.04系统之 - 安装搜狗输入法出现破坏fcitx-ui-qimpanel问题
  19. 手机回收价格大起底,换换回收分析为什么“破烂”也值钱?
  20. word文档字不靠边_word字不在页面中间位置

热门文章

  1. 6、set_xlim、set_ylim、xticks、yticks、set_xlabels、set_ylabels 和 双坐标轴twin()
  2. SQLServer数据库写操作报错String or binary data would be truncated问题解决
  3. Servlet(1) Servlet容器和Servlet
  4. 2021-08-15 reponse文件下载路径
  5. java vector pair_STL: list ,set ,pair.map的使用
  6. 施密特正交化_夜思 | 为什么非实对称矩阵对应的特征向量不能施密特正交化?...
  7. Docker教程小白实操入门(9)--基于export导出容器与基于import导入一个镜像
  8. javascript 为对象中的二级元素赋值 1006 Uncaught TypeError: Cannot set property ‘‘ of undefined
  9. ping可以访问百度ip但不能访问百度域名|couldn't resolve host api.weixin.qq.com
  10. ubuntu定时任务cron 访问网址php