1 /** 这道题甚是巧妙啊,也是看了别人的代码才A的……,我相信如果你看了以后也会茅塞顿开的 */
 2 #include <iostream>
 3 #include <cstdio>
 4 using namespace std;
 5 #define N 1005
 6
 7 int head1, tail1, head2, tail2, qMax[N][N], qMin[N][N], matrix[N][N];
 8
 9 struct node{
10     int v, id;
11 }q1[N], q2[N];
12
13 void addMax( int v, int id ) {  //维护队列最大值
14     while( head1 < tail1 && q1[tail1-1].v <= v ) tail1--;
15     q1[tail1].v = v; q1[tail1++].id = id;
16 }
17
18 int getMaxNum( int id ) {
19     while( head1 < tail1 && q1[head1].id < id ) head1++;
20     return q1[head1].v;
21 }
22
23 void addMin( int v, int id ) {
24     while( head2 < tail2 && q2[tail2-1].v >= v ) tail2--;
25     q2[tail2].v = v; q2[tail2++].id = id;
26 }
27
28 int getMinNum( int id ) {
29     while( head2 < tail2 && q2[head2].id < id ) head2++;
30     return q2[head2].v;
31 }
32
33 int main() {
34     int n, m, r, c, i, j;
35     while(scanf("%d%d%d%d", &n, &m, &r, &c) != EOF) {
36         for( i = 0; i < n; ++i )
37         for( j = 0; j < m; ++j ) scanf("%d", &matrix[i][j]);
38
39         for( j = 0; j < m; ++j ) {
40             head1 = tail1 = head2 = tail2 = 0;
41             for( i = 0; i < r - 1; ++i ) {
42                 addMax( matrix[i][j], i );
43                 addMin( matrix[i][j], i );
44             }
45             /** 这里qMax[i][j]表示第j列, max( matrix[ i->(i+r) ][j] )中的最大值
46             *   qMin[i][j],同上。
47             */
48             for( i = r - 1; i < n; ++i ) {
49                 addMax( matrix[i][j], i );
50                 qMax[i-r+1][j] = getMaxNum( i-r+1 );
51                 addMin( matrix[i][j], i );
52                 qMin[i-r+1][j] = getMinNum( i-r+1 );
53             }
54         }
55         /** 这里qMax[i][j]表示第j列, max( qMax[i][ j->(j+c) ] )中的最大值
56         *   即qMax[i][j]表示以(i,j)为左上角的一个r*c子矩阵中的最大值
57         *   qMin[i][j],同上。
58         */
59         for( i = 0; i < n - c + 1; ++i ) {
60             head1 = tail1 = head2 = tail2 = 0;
61             for( j = 0; j < c - 1; ++j ) {
62                 addMax( qMax[i][j], j );
63                 addMin( qMin[i][j], j );
64             }
65             for( j = c - 1; j < m; ++j ) {
66                 addMax( qMax[i][j], j );
67                 qMax[i][j-c+1] = getMaxNum(j-c+1);
68                 addMin( qMin[i][j], j );
69                 qMin[i][j-c+1] = getMinNum(j-c+1);
70             }
71         }
72         int res = qMax[0][0] - qMin[0][0];
73         for( i = 0; i < n - r + 1; ++i )
74         for( j = 0; j < m - c + 1; ++j )
75         res = res > qMax[i][j] - qMin[i][j] ? res : qMax[i][j] - qMin[i][j];
76         printf("%d\n", res);
77     }
78     return 0;
79 }

转载于:https://www.cnblogs.com/yaling/p/3440324.html

FZU 2080 最大差值 二维单调队列(甚是巧妙……)相关推荐

  1. 【CF 1195】Basketball Exercise/Submarine in the Rybinsk Sea (hard edition)/OpenStreetMap+二维单调队列滑动窗口模板

    寡人认为C,E都是比较板的题 butD2也太ex了,大大是被那个mod精给弄疯了,我mod了那么多次还是炸了longlong orz 文章目录 二维单调队列模板 C:Basketball Exerci ...

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

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

  3. java_微信公众号扫码绑定个人信息(微信公众号场景值二维码的使用)

    看了一下网上关于公众号场景值二维码这方面的教程,基本上是微信官方开发文档的复制,没有具体实例.这里给出实例,并附加二维码url转文件流的方法. 思路: 1.后台传入个人信息保存,以个人信息的" ...

  4. 【BZOJ-28921171】强袭作战大sz的游戏 权值线段树+单调队列+标记永久化+DP...

    2892: 强袭作战 Time Limit: 50 Sec  Memory Limit: 512 MB Submit: 45  Solved: 30 [Submit][Status][Discuss] ...

  5. 算法竞赛入门与进阶 (二)单调队列、单调栈

    栈(stack)和队列( queue ) 1.栈的定义:栈是限定仅在表头进行插入和删除操作的线性表(先进后出) 2.队列的定义:队列是一种特殊的线性表,特殊之处在于 它只允许在表的前端(front)进 ...

  6. 单调队列优化的DP问题

    概述 单调队列就是通过排除求最值时候的冗余,从而是队列具有性质,可以方便求解问题. DP的两个阶段: 朴素DP的基本原理--闫氏DP分析法 对朴素DP进行优化 闫氏DP分析法的拓展 :在一个有限的集合 ...

  7. CSP2019洛谷P5665:划分(单调队列,高精度)

    解析 自己写的时候写了二维单调队列优化的64分 一次过还是可以满意了啦 正解的关键结论是最优的方案的最后一段一定尽可能的短 原因嘛-显然 贪心的想,再最后一段的段首可以往前放的情况下肯定是要往前放的, ...

  8. bzoj1047 [HAOI2007]理想的正方形 单调队列

    这种在矩形里面找矩形有固定的套路,不是容斥就是左右上下延伸,这个题就是向左向右延伸.. 然后手玩优化发现邻位转移比暴力要好一些,可以用splay统计,但复杂度不对 然后由于每一行互不影响于是可以单行同 ...

  9. 洛谷试炼场 4-8单调队列

    layout: post title: 洛谷试炼场 4-8单调队列 author: "luowentaoaa" catalog: true mathjax: true tags: ...

最新文章

  1. Visual Studio Code / Roboware Studio调整字体大小,跳转等操作
  2. logback logback.xml常用配置详解(三) filter
  3. AndroidStudio中提示:uses-sdk:minSdkVersion 16 cannot be smaller than version 19 declared in libr
  4. layui富文本编译器添加图片
  5. android返回后屏幕旋转了,Android recovery 模式下屏幕显示旋转
  6. python学习之路基础篇(第八篇)
  7. ssm 转发请求_千呼万唤!阿里内部终于把这份SSM框架技术学习笔记分享出来了...
  8. 有效提高作品率的UI设计技巧,你知道多少?
  9. react native 处理iOS和安卓系统文字
  10. python手机版-python做app
  11. 【数学】指数函数与对数函数的导数证明
  12. css本文在背景之上,css实现文字在背景图片之上
  13. java定义一个描述三角形的类_用java语言定义一个三角形类 Triangle ,
  14. EBP与ESP的作用
  15. 一套仿英雄联盟大型多人联机实时对战游戏源码(包含完整服务器和客户端源码)...
  16. es多个字段排序_如何解决 ES 复杂聚合排序问题(嵌套桶排序)?
  17. Silvaco学习笔记(九)毕设相关
  18. KITTI数据集下载(百度云)
  19. 安卓手机开机动画制作修改教程
  20. 通过Teamview后台去除限制

热门文章

  1. vnpy学习_02各文件功能梳理
  2. 程序员加班制作了30张可视化大屏模板,套用数据直接用
  3. 案例分享|某医药集团的BI建设案例
  4. Bootstrap Table事件
  5. 全局替换安卓应用字体
  6. centos安装软件格式为rpm
  7. python中的函数(function)也是对象(二分钟读懂)
  8. python字节码执行函数_做一个字节码追踪器,从内部理解 Python 的执行过程
  9. redis字符串匹配_Redis设计原理
  10. hnu暑期实训之487-3279 字符串处理