首页 > 其他分享 >理想的正方形

理想的正方形

时间:2022-09-21 22:45:55浏览次数:82  
标签:理想 int tt 矩阵 正方形 hh 滑动 最大值

原题链接

题目描述

给定一个n*m的矩w,在所有边长为k的子矩阵中,找到该子矩阵的最大值与最小值之差最小的矩阵,输出该差

分析

直接做不好做,分两步

  1. 对每行做一遍滑动窗口,找到以i为右端点的长度为k的滑动窗口的最大值,将其存到对应位置上
  2. 1的前提下,对每列做一遍滑动窗口,则输出即为边长为k的子矩阵的最大值

最小值同理
然后枚举每个子矩阵,找到差值最小的即可

Code

#include <iostream>
#include <cstring>

constexpr int N = 1005;

int n, m, k;
int w[N][N], maxv[N][N], minv[N][N];
int q[N];

void get_min(int a[], int b[], int len) {
    int hh = 0, tt = -1;
    for (int i = 1; i <= len; i ++ ) {
        if (hh <= tt && q[hh] < i - k + 1) hh ++ ;
        while (hh <= tt && a[q[tt]] >= a[i]) tt -- ;
        q[ ++ tt] = i;
        b[i] = a[q[hh]];
    }
}

void get_max(int a[], int b[], int len) {
    int hh = 0, tt = -1;
    for (int i = 1; i <= len; i ++ ) {
        if (hh <= tt && q[hh] < i - k + 1) hh ++ ;
        while (hh <= tt && a[q[tt]] <= a[i]) tt -- ;
        q[ ++ tt] = i;
        b[i] = a[q[hh]];
    }
}

int main() {
    std::cin >> n >> m >> k;
    for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= m; j ++ ) 
            std::cin >> w[i][j];
            
    for (int i = 1; i <= n; i ++ ) {
        get_min(w[i], minv[i], m);
        get_max(w[i], maxv[i], m);
    }
    
    int a[N], b[N], c[N], d[N];
    int res = 1e9;
    for (int i = k; i <= m; i ++ ) {
        for (int j = 1; j <= n; j ++ ) {
            a[j] = minv[j][i];
            b[j] = maxv[j][i];
        }
        get_min(a, c, n);
        get_max(b, d, n);

        for (int j = k; j <= n; j ++ ) res = std::min(res, d[j] - c[j]);
    }
    
    std::cout << res << '\n';
    return 0;
}

标签:理想,int,tt,矩阵,正方形,hh,滑动,最大值
From: https://www.cnblogs.com/zjh-zjh/p/16717442.html

相关文章

  • T1056点和正方形的关系 (信息学一本通C++)
     目录 [题目描述]有一个正方形,四个角的坐标(x,y)分别是(1,-1),(1,1),(-1,-1),(-1,1),x是横轴,y是纵轴。写一个程序,判断一个给定的点是否在这个正方形内(包括正方形边界)。如果......
  • 《关于程序猿也得刷行测题的这一天》——第一章:理想与现实
    别人一谈到程序员,都以为是上天入地,无所不能,代码在他们的手中就像花一样。大到可以把大道都给磨灭的量子计算机,小到可以随手修好邻居老王家的路由。就差不能送全体地球人......
  • 最大正方形
    问题:在一个由 '0' 和 '1' 组成的二维矩阵内,找到只包含 '1' 的最大正方形,并返回其面积。   输入:matrix=[["1","0","1","0","0"],["1","0","1","1","1"],["1&q......
  • LeetCode 593. 有效的正方形(向量做法)
    题目题目链接:593.有效的正方形题意:给出二维平面上四个点的坐标,判断这四个点是否能构成一个正方形,四个点的输入顺序不做任何保证。思路通过向量运算可以很轻松地解决这......