二维单调队列

rmq很明显会超时,如果这个序列是一维的,很明显就是个单调队列,现在就是把一维的单调队列转换为二维单调队列。

先求出每一列的窗口极值,然后对于每一行做单调队列,值就是之前求出每个位置结尾的极值,这样就求出了每个正方形的极值。

写起来要注意一些。

#include<bits/stdc++.h>
using namespace std;
const int N = ;
int a, b, n, ans = << ;
int d[N][N], mx[N][N], mn[N][N], q1[N], q2[N], mxx[N][N], mnn[N][N];
int main()
{
// freopen("square.in", "r", stdin);
// freopen("square.out", "w", stdout);
scanf("%d%d%d", &a, &b, &n);
for(int i = ; i <= a; ++i)
for(int j = ; j <= b; ++j) scanf("%d", &d[i][j]);
for(int i = ; i <= a; ++i)
{
int l1 = , r1 = , l2 = , r2 = ;
for(int j = ; j <= b; ++j)
{
while(l1 <= r1 && j - q1[l1] + > n) ++l1;
while(l1 <= r1 && d[i][j] > d[i][q1[r1]]) --r1;
while(l2 <= r2 && j - q2[l2] + > n) ++l2;
while(l2 <= r2 && d[i][j] < d[i][q2[r2]]) --r2;
q1[++r1] = j;
q2[++r2] = j;
mx[i][j] = d[i][q1[l1]];
mn[i][j] = d[i][q2[l2]];
// printf("mx[%d][%d]=%d mn[%d][%d]=%d\n", i, j, mx[i][j], i, j, mn[i][j]);
}
}
for(int j = n; j <= b; ++j)
{
int l1 = , r1 = , l2 = , r2 = ;
for(int i = ; i <= a; ++i)
{
while(l1 <= r1 && i - q1[l1] + > n) ++l1;
while(l1 <= r1 && mx[i][j] > mx[q1[r1]][j]) --r1;
while(l2 <= r2 && i - q2[l2] + > n) ++l2;
while(l2 <= r2 && mn[i][j] < mn[q2[r2]][j]) --r2;
q1[++r1] = i;
q2[++r2] = i;
mxx[i][j] = mx[q1[l1]][j];
mnn[i][j] = mn[q2[l2]][j];
// printf("mxx[%d][%d]=%d mnn[%d][%d]=%d\n", i, j, mxx[i][j], i, j, mnn[i][j]);
}
}
for(int i = n; i <= a; ++i)
for(int j = n; j <= b; ++j) ans = min(ans, mxx[i][j] - mnn[i][j]);
printf("%d\n", ans);
// fclose(stdin);
// fclose(stdout);
return ;
}

最新文章

  1. ie11的DOM管理器报错
  2. SQL Server 事务日志传输
  3. jQuery全屏动画焦点图
  4. vb上位机模拟电压监测系统
  5. ASP.NET Core 1.0 中的依赖项管理
  6. java 十六进制颜色对照表
  7. jQuery添加删除元素
  8. windows操作系统的快捷键
  9. C#中string[ ] args是什么意思,又有什么用呢
  10. ACM编程技巧--常用字符操作函数
  11. initWithCoder: 与initWithFrame:
  12. justAP1.3.0版发布了
  13. asp.net如何把一个tostring类型转化为dateTime类型
  14. LoadRunner 调用Dll完成加密解密
  15. Android 社区App 《窝吧》开源分享
  16. FFmpeg的H.264解码器源代码简单分析:概述
  17. aspx 页面中 js 引用与页面后台的数据交互 --【 后台调用 js 】
  18. OAuth授权 | 把这一篇丢给他
  19. 有些人表面风光,背地里for循环怎么写都要百度
  20. svn 基础

热门文章

  1. PHP 反射API
  2. 高阶函数 map,reduce, filter的用法
  3. Python数据类型之数字类型
  4. js给对象添加属性
  5. 将 Oracle VirtualBox 中运行的虚拟机导入 VMware Fusion、Workstation 或 Player
  6. Linux下汇编语言学习笔记2 ---
  7. baidu 和 es 使用
  8. Orcle定时生成表数据作业
  9. ETL全量单表同步简述
  10. CCNA一些要点