日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

[HAOI2007] 理想的正方形

發(fā)布時(shí)間:2025/4/16 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [HAOI2007] 理想的正方形 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

洛谷題目鏈接:[HAOI2007]理想的正方形

題目描述

有一個(gè)ab的整數(shù)組成的矩陣,現(xiàn)請(qǐng)你從中找出一個(gè)nn的正方形區(qū)域,使得該區(qū)域所有數(shù)中的最大值和最小值的差最小。

輸入輸出格式

輸入格式:

第一行為3個(gè)整數(shù),分別表示a,b,n的值

第二行至第a+1行每行為b個(gè)非負(fù)整數(shù),表示矩陣中相應(yīng)位置上的數(shù)。每行相鄰兩數(shù)之間用一空格分隔。

輸出格式:

僅一個(gè)整數(shù),為ab矩陣中所有“nn正方形區(qū)域中的最大整數(shù)和最小整數(shù)的差值”的最小值。

輸入輸出樣例

輸入樣例#1:

5 4 2
1 2 5 6
0 17 16 0
16 17 2 1
2 10 2 1
1 2 2 2

輸出樣例#1:

1

說明

問題規(guī)模

(1)矩陣中的所有數(shù)都不超過1,000,000,000

(2)20%的數(shù)據(jù)2<=a,b<=100,n<=a,n<=b,n<=10

(3)100%的數(shù)據(jù)2<=a,b<=1000,n<=a,n<=b,n<=100

一句話題意: 在一個(gè)\(n*m\)的矩陣中找一個(gè)大小為\(k\)的正方形使得這個(gè)正方形內(nèi)的最大值與最小值的差值最小.

題解: 首先分析一下數(shù)據(jù)范圍,顯然這個(gè)算法的復(fù)雜度是\(O(n^2)\)的,然而這里需要統(tǒng)計(jì)的是最值,無法使用前綴和,所以這里考慮使用單調(diào)隊(duì)列來維護(hù).

既然是一個(gè)正方形,那么很顯然在枚舉到這個(gè)正方形的左上角的頂點(diǎn)的時(shí)候,這個(gè)正方形就已經(jīng)可以確定了.所以我們可以豎著先求一遍最大/最小值,然后再用這個(gè)最大/最小值來求出一個(gè)正方形中的最大/最小值.

這里將每個(gè)位置向下\(k\)格的最大值/最小值用\(Mx[i][j]/Mn[i][j]\)存起來(即\(Mx[i][j] = max(a[i][j], a[i+1][j], ... , a[i+k-1][j])\), \(Mn[i][j]\)同理).

其實(shí)說白了就是先將每個(gè)位置求出連續(xù)的\(k\)個(gè),也即是豎著求一遍滑動(dòng)窗口,然后把這些連續(xù)的\(k\)個(gè)都看做一個(gè)個(gè)的格子,再橫著求一遍滑動(dòng)窗口.這個(gè)可以好好想想為什么.

#include<bits/stdc++.h> using namespace std; const int N=1000+5; const int inf=2147483647;int n, m, k, a[N][N], Mx[N][N], Mn[N][N], mx[N], mn[N], h1, t1, h2, t2, ans = inf;int main(){ios::sync_with_stdio(false);cin >> n >> m >> k;for(int i=1; i<=n; i++)for(int j=1; j<=m; j++)cin >> a[i][j];for(int i=1; i<=m; i++){//豎著求最大值,保存到Mx[i][j]/Mn[i][j]中h1 = h2 = 1, t1 = t2 = 0;for(int j=1; j<=n; j++){while(h1 <= t1 && a[mx[t1]][i] <= a[j][i]) t1--;while(h2 <= t2 && a[mn[t2]][i] >= a[j][i]) t2--;mx[++t1] = mn[++t2] = j;while(h1 <= t1 && mx[h1]+k <= mx[t1]) h1++;while(h2 <= t2 && mn[h2]+k <= mn[t2]) h2++;if(j >= k) Mx[j-k+1][i] = a[mx[h1]][i], Mn[j-k+1][i] = a[mn[h2]][i];}}for(int i=1; i<=n-k+1; i++){h1 = h2 = 1, t1 = t2 = 0, mx[t1] = mn[t2] = 0;for(int j=1; j<=m; j++){while(h1 <= t1 && Mx[i][mx[t1]] <= Mx[i][j]) t1--;while(h2 <= t2 && Mn[i][mn[t2]] >= Mn[i][j]) t2--;mx[++t1] = mn[++t2] = j;while(h1 <= t1 && mx[h1]+k <= mx[t1]) h1++;while(h2 <= t2 && mn[h2]+k <= mn[t2]) h2++;if(j >= k) ans = min(ans, Mx[i][mx[h1]]-Mn[i][mn[h2]]);}}printf("%d\n", ans);return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/BCOI/p/9166730.html

總結(jié)

以上是生活随笔為你收集整理的[HAOI2007] 理想的正方形的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。