scu 3636 二維單調佇列

2021-07-07 02:15:24 字數 1518 閱讀 2819

題意:

從乙個大a*b的矩陣中,找出乙個n*n正方形的區域,找出最大值和最小值,最後輸出a*b矩陣中所有「n*n正方形區域中的最大整數和最小整數的差值」的最小值。

做法:

二維單調佇列,類似那個滑窗的題目。對於這題可以考慮將每一行的長度為n的區段的最大值和最小值都壓縮到乙個點上,這邊就可以單調佇列的做法,對於每一行從左到右做一次那個滑窗,這樣壓縮過後,每一行下標》=n-1的點都儲存了以他為結尾的長度為n的最值。

這樣之後再利用之前壓縮好的店,對於每一列做一次單調佇列查詢最值,因為此時每乙個點儲存的是他所在的行的以他為結尾的長度為n的最值,我在根據這個來查詢每一列的長度為n的最值,就等於查詢了以這個點為右下角的點的n*n的正方形區域的最值。問題得以解決。

將問題分解成兩個方向來考慮,分別運用單調佇列就可以了。

#include 

#include

#include

#include

#include

using

namespace

std;

#define m 1009

#define inf 0x3f3f3f3f

typedef

struct

node;

int mp[m][m];

int lmin[m][m],lmax[m][m];

int tmin[m][m],tmax[m][m];

int a,b,n;

int ans ;

void getcol(int x)

); while(!qmax.empty() && qmax.back().num < mp[x][i]) qmax.pop_back();

qmax.push_back();

while(i - qmin.front().st >= n) qmin.pop_front();

while(i - qmax.front().st >= n) qmax.pop_front();

if(i >= n-1)

}}void getrow(int x)

); while(!qmax.empty() && qmax.back().num < lmax[i][x]) qmax.pop_back();

qmax.push_back();

while(i - qmin.front().st >= n) qmin.pop_front();

while(i - qmax.front().st >= n) qmax.pop_front();

if(i >= n-1 && x >= n-1)

}}int main()

}for(int i = 0;i < a;i++) getcol(i); //壓縮每一行

for(int i = 0;i < b;i++) getrow(i); //利用壓縮行後的來對每一列進行單調佇列

printf("%d\n",ans);

}return

0;}

二維陣列與二維指標

1.二維陣列的儲存是線性的,可以通過一維指標的方式訪問。如一下 int map 5 5 int mapd map 0 0 則 map i j mapd i 5 j 而利用二維陣列線性儲存的特性,可以將二維陣列當作一維指標方便的在函式之間傳遞 如 將乙個二維陣列賦值給乙個動態二維陣列,引數設定為一維指...

二維指標和二維陣列

二維指標和二維陣列有三種形式 1,type ptr 2,type ptr或者type prt 3,type prt 三種形式意思相近,也有區別。首先三種形式都能表示二維的資料結構。1,type ptr 表示乙個指向指標的指標 但是在一開始宣告的時候 type ptr ptr到底指向幾個指標是不知道的...

二維陣列與二維指標

一.指標與二維陣列 以martix 3 4 為例 1.二維陣列的本質 int martix 3 4 int martix 3 4 int 4 martix 3 令int 4 為type,type martix 3 為含有三個元素的陣列,每乙個元素型別為int 4 int 4 是乙個擁有4個int型別...