洛谷[p2216]理想的正方形

Mr_Wolfram的高维空间 Mr_Wolfram的高维空间     2022-10-16     144

关键词:

二维单调队列

先横向跑一边单调队列,记录下每一行长度为n的区间的最值
在纵向跑一边单调队列,得出结果
注意,mi要初始化为一个足够大的数

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int init() {
    int rv = 0, fh = 1;
    char c = getchar();
    while(c < '0' || c > '9') {
        if(c == '-') fh = -1;
        c = getchar();
    }
    while(c >= '0' && c <='9') {
        rv = (rv<<1) + (rv<<3) + c - '0';
        c = getchar();
    }
    return fh * rv;
}
const int MAXN = 2005;
int num[MAXN][MAXN], ma[MAXN][MAXN], mi[MAXN][MAXN], n, a, b, ans = 0x7fffffff;
struct ddque{
    int que[MAXN<<3], head, tail;
    void clear(bool opt){
        que[0] = opt? 0: 0x7fffffff; //注意这里
        head = tail = 0;
    }
    void insert(int x, bool opt){
        if(!opt) {
            while(que[tail] > x && tail >= head) tail--;
            que[++tail] = x;
        }else {
            while(que[tail] < x && tail >= head) tail--;
            que[++tail] = x;
        }
    }
    void pop(int x){
        if(que[head] == x) head++;
    }
    int query(){
        return que[head];
    }
}q1, q2;
int main() {
    freopen("in.txt", "r", stdin);
    memset(mi,0x7f,sizeof(mi));
    a = init(); b = init(); n = init();
    for(int i = 1 ; i <= a ; i++) {
        for(int j = 1 ; j <=b ; j++) {
            num[i][j] = init();
        }
    }
    for(int i = 1 ; i <= a ; i++) {
        q1.clear(0); q2.clear(1);
        for(int j = 1 ; j <= n ; j++) {
            q1.insert(num[i][j], 0);
            q2.insert(num[i][j], 1);
        }
        ma[i][n] = q2.query();
        mi[i][n] = q1.query();
        for(int j = n + 1 ; j <= b ; j++) {
            q1.insert(num[i][j], 0);
            q2.insert(num[i][j], 1);
            q1.pop(num[i][j - n]);
            q2.pop(num[i][j - n]);
            ma[i][j] = q2.query();
            mi[i][j] = q1.query();
        }
    }
    for(int j = n ; j <= b ; j++) {
        q1.clear(0); q2.clear(1);
        for(int i = 1 ; i <= n ; i++) {
            q1.insert(mi[i][j], 0);
            q2.insert(ma[i][j], 1);
        }
        ans = min(ans, q2.query() - q1.query());
        for(int i = n + 1 ; i <= a ; i++) {
            q1.insert(mi[i][j], 0);
            q2.insert(ma[i][j], 1);
            q1.pop(mi[i - n][j]);
            q2.pop(ma[i - n][j]);
            ans = min(ans, q2.query() - q1.query());
        }
    }
    cout<<ans<<endl;
    fclose(stdin);
    return 0;
}

洛谷p2216[haoi2007]理想的正方形||二维rmq的单调队列

题目这个题的算法核心就是求出以i,j为左上角,边长为n的矩阵中最小值和最大值。最小和最大值的求法类似。单调队列做法:以最小值为例:q1[i][j]表示第i行上,从j列开始的n列的最小值。$q1[i][j]=min(x[i][j],x[i][j+1],...,x[i][j+n-1])$$q... 查看详情

p2216[haoi2007]理想的正方形

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

p2216[haoi2007]理想的正方形

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

p2216[haoi2007]理想的正方形(代码片段)

题目描述写一个程序来模拟操作系统的进程调度。假设该系统只有一个CPU,每一个进程的到达时间,执行时间和运行优先级都是已知的。其中运行优先级用自然数表示,数字越大,则优先级越高。如果一个进程到达的时候CPU是空... 查看详情

p2216[haoi2007]理想的正方形-单调队列(代码片段)

...作单调队列的空间记得开大点!反正内存够用注意,这题正方形边长是固定的!暴力算法是枚举上边界所在的行,左边界所在的列,通过这两个个信息确定一个正方形,然后预处理出一行中从第i个点到i+n个点的最值,再扫一遍... 查看详情

p2216[haoi2007]理想的正方形(二维rmq)

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

p2216[haoi2007]理想的正方形(单调队列)(代码片段)

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

p2216[haoi2007]理想的正方形

P2216[HAOI2007]理想的正方形 题目描述有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小。a,b<=1000 分析题目:首先可以想到一个O(a*b*n)的解法:我最开始想... 查看详情

p2216[haoi2007]理想的正方形(代码片段)

...:有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小很显然我们可以用DP水掉这道题的大多数分。设f_max[i][j][k]表示以坐标[i,j]为右下角,边长为k的正方形的最大... 查看详情

洛谷oj2216理想的正方形单调队列(二维)

....luogu.org/problem/show?pid=2216题意:给出a*b矩形从中找到一个n*n正方形,其(最大值-最小值之差)最小,a,b<=1e3,n<=100暴力枚举正方形右下角,如何快速算出其最大值和最小值?先用单调队列预处理出ma[i][j]表示(i,j)以第i行j列结尾长度为n的... 查看详情

单调队列进阶(代码片段)

单调队列进阶1.维护矩形最值P2216[HAOI2007]理想的正方形例子:a×ba\\timesba×b的矩形中所有n×nn\\timesnn×n的正方形最值。先用单调队列预处理出所有(i,j)(i,j)(i,j)向左最大长度为nnn的最值。然后再用单调队列一行一行的维护每行的... 查看详情

洛谷p1548棋盘问题

...lt;=N<=100,1<=M<=100)(30%)求出该棋盘中包含有多少个正方形、多少个长方形(不包括正方形)。例如:当N=2,M=3时: 正方形的个数有8个:即边长为1的正方形有6个;边长为2的正方形有2个。长方形的个数有10个:即2*1的长... 查看详情

洛谷p1548棋盘问题

...lt;=N<=100,1<=M<=100)(30%)求出该棋盘中包含有多少个正方形、多少个长方形(不包括正方形)。例如:当N=2,M=3时: 正方形的个数有8个:即边长为1的正方形有6个;边长为2的正方形有2个。长方形的个数有10个:即2*1的长... 查看详情

bzoj1047[haoi2007]理想的正方形

1047:[HAOI2007]理想的正方形TimeLimit: 10Sec  MemoryLimit: 162MBSubmit: 3311  Solved: 1819[Submit][Status][Discuss]Description  有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域 查看详情

bzoj1047:[haoi2007]理想的正方形

1047:[HAOI2007]理想的正方形TimeLimit: 10Sec  MemoryLimit: 162MBSubmit: 3530  Solved: 1946[Submit][Status][Discuss]Description有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有 查看详情

洛谷——p1548棋盘问题

...lt;=N<=100,1<=M<=100)(30%)求出该棋盘中包含有多少个正方形、多少个长方形(不包括正方形)。例如:当N=2,M=3时: 正方形的个数有8个:即边长为1的正方形有6个;边长为2的正方形有2个。长方形的个数有10个:即2* 查看详情

bzoj1047:[haoi2007]理想的正方形

1047:[HAOI2007]理想的正方形TimeLimit:10Sec  MemoryLimit:162MBSubmit:3448  Solved:1894[Submit][Status][Discuss]Description  有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差... 查看详情

[bzoj1047][haoi2007]理想的正方形

1047:[HAOI2007]理想的正方形TimeLimit:10Sec  MemoryLimit:162MBSubmit:3481  Solved:1917[Submit][Status][Discuss]Description  有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差... 查看详情