二维单调队列

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 ;
}

bzoj1047的更多相关文章

  1. 【bzoj1047】理想的正方形

    [bzoj1047]理想的正方形 题意 给定\(a*b\)由整数组成的矩形. 现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值 的差最小. \(1\leq a,b\leq 10 ...

  2. 【BZOJ1047】[HAOI2007]理想的正方形(单调队列,动态规划)

    [BZOJ1047][HAOI2007]理想的正方形(单调队列,动态规划) 题面 BZOJ 洛谷 题解 直接一个单调队列维护一下没给点和它前面的\(n\)个位置的最大值,再用一次单调队列维护连续\(n ...

  3. 【BZOJ1047】[HAOI2007]理想的正方形

    [BZOJ1047][HAOI2007]理想的正方形 题面 bzoj 洛谷 题解 二维\(st\)表,代码是以前的 #include<iostream> #include<cstdi ...

  4. [bzoj1047][HAOI2007]理想的正方形_动态规划_单调队列

    理想的正方形 bzoj-1047 HAOI-2007 题目大意:有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 注释:$2\le a, ...

  5. BZOJ1047: [HAOI2007]理想的正方形 [单调队列]

    1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2857  Solved: 1560[Submit][St ...

  6. BZOJ1047: [HAOI2007]理想的正方形

    传送门 蛤省省选果然水啊,我这种蒟蒻都能一遍A. 横向纵向维护两个单调队列,做两次求最大和最小的,总复杂度$O(NM)$ 码农题,考察代码实现能力 //BZOJ 1047 //by Cydiater ...

  7. [BZOJ1047][HAOI2007]理想的正方形(RMQ+DP)

    题意 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 思路 RMQ求 再DP 代码 #include<cstdio> #i ...

  8. bzoj1047/luogu2216 理想的正方形 (单调队列)

    开b组单调队列,分别维护此时某一列中的最大/最小值 然后我每次把它们的头取出来,塞到维护行的单调队列里,就是n*n的最大/最小值 #include<bits/stdc++.h> #defi ...

  9. BZOJ1047[HAOI2007]理想的正方形——二维ST表

    题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入 第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非 ...

  10. BZOJ1047或洛谷2216 [HAOI2007]理想的正方形

    BZOJ原题链接 洛谷原题链接 显然可以用数据结构或\(ST\)表或单调队列来维护最值. 这里采用单调队列来维护. 先用单调队列维护每一行的最大值和最小值,区间长为正方形长度. 再用单调队列维护之前维 ...

随机推荐

  1. 建仓类型与对应建仓价MT4

    建仓类型与对应建仓价 (Bid,Ask) 建仓类型 对应建仓价 Buy Ask+Spread Sell Bid-Spread BuyLimit Ask-Spread-StopLevel SellLim ...

  2. UE4 插件扩展引擎工具栏

    UE4 作为游戏引擎,已经提供了非常强大的游戏开发的API.作为游戏制作者来讲,我们需要一些专用的功能辅助我们更好的开发游戏,而不是仅仅从构建游戏逻辑出发.因此也就有了扩展编辑器功能的这个想法,还好 ...

  3. poj1984并查集的相对偏移

    #include<stdio.h>//典型题 #include<math.h> #define N 40010 struct node { int x,y,z; }pre[N] ...

  4. MySQL Workbench基本操作

    MySQL Workbench是一款专为MySQL设计的ER/数据库建模工具.它是著名的数据库设计工具DBDesigner4的继任者.你可以用MySQL Workbench设计和创建新的数据库图示,建 ...

  5. JavaScript面向对象实现

    JavaScript面向对象实现 一:面向对象三大特征 继承,封装,多态! 二:JavaScript自定义对象  创建对象的方式: 方式1,对象初始化器方式: <script type=&quo ...

  6. Kettle循环删除数据

    1.问题描述: 某个系统原库的数据同步到备份库.但是由于原库的的数据会物理删除,此时需要删除备份库的数据. 2.不理想的解决1: 1)首先从备份库获取该表的所有ID: 2)循环备份库的ID,去原库检测 ...

  7. HDU 5074 Hatsune Miku 2014 Asia AnShan Regional Contest dp(水

    简单dp #include <stdio.h> #include <cstring> #include <iostream> #include <map> ...

  8. Windows上安装Mac OS

    在windows上开发ios程序,是一件比較痛苦的事情.由于: 开发android程序,使用eclipse.eclipse有windows版同一时候也有mac版,所以mac上开发android程序和w ...

  9. javascript statically scope

    在javascript 里面, 函数中使用的未定义的变量,会默认变为全局的变量. 而通过 var 这个关键字定义的变量,就是局部变量. As far as the output is concerne ...

  10. 在DevExpress GridControl的一列中显示图片

    作者:jiankunking 出处:http://blog.csdn.net/jiankunking 近期做项目的时候用到了将GridControl中一列设置为PictureEdit类型,然后通过这一 ...