單調佇列,棧專題

2022-03-05 18:13:51 字數 3211 閱讀 1999

a題:

hdu - 1506 

題目大意:給你n個點,每乙個點代表當前座標下的矩形的高度,然後問你最大的矩形面積。

具體思路:我們可以用乙個棧維護最大值,這個棧內的元素都是保持單調的,如果當前輸入的數比棧頂元素小的話,這個時候我們先算一波棧裡面的最大值,判斷停止的時候是當棧頂元素比當前輸入的元素小的時候停就可以了,因為要保持棧內元素的單調性。

ac**:

1 #include2 #include3 #include4 #include

5 #include6 #include7 #include8 #include9 #include10

using

namespace

std;

11 # define ll long

long

12ll max(ll t1,ll t2)

1318

intmain()

1938 t.second=tmp;

39//

cout<40

q.push(t);41}

42while(!q.empty())

4348 printf("

%lld\n

",maxx);49}

50return0;

51 }

b題:hdu - 4252

題目大意:給你n個建築的高度,問你最少會有多少建築,判斷的條件就是當前這個建築往左,在碰到比他高的建築的時候,就會被遮蓋住,如果是碰到小於等於的話,就不會被遮蓋。

具體思路:用單調棧維護乙個遞增序列, 如果輸入的數有0,那就說明前面的建築和後後面接下裡的建築沒有關係了。

ac**:

1 #include2 #include3 #include4 #include

5 #include6 #include7 #include8 #include9 #include10

using

namespace

std;

11 # define ll long

long

12int

main()

1329

else

3036

else

3742

if(q.empty()||q.top()43 ans++;

44q.push(tmp);45}

46}47}

48 printf("

case %d: %d\n

",++case,ans);49}

50return0;

51 }

d題:poj - 3250 

題目大意:給你n頭牛,然後問你從左到右,每頭牛能看見的牛的數目的總和。(牛只能往下方看,水平的牛看不見。。(真牛逼))

具體思路: 用單調棧維護乙個嚴格單調遞減子串行,每一次放入乙個牛,我們先判斷當前這個牛的高度和棧頂牛的高度,如果當前牛的高度大於棧頂牛的高度,我們就直接pop到棧頂的元素大於當前牛的高度,這個時候再把棧裡面的元素個數加一下,因為這個時候棧裡面的元素都能看到新 插入的這頭牛。

ac**:

1 #include2 #include3 #include4 #include

5 #include6 #include7 #include8 #include9 #include10

using

namespace

std;

11 # define ll long

long

12int

main()

1330 sum+=q.size();

31q.push(tmp);32}

33}34 printf("

%lld\n

",sum);

35return0;

36 }

f題:poj - 2796 

題目大意:給你n個數,然後定義一種運算,就是限制l,r的範圍,然後這一段範圍內每個數的和,然後再乘以這個區間內的最小值,問你這種運算的最大值,並且輸出此時的l,r。

具體思路:我們首先列舉每乙個數,他能到達的左邊界和右邊界,限制的範圍就是這個範圍內的數都比當前列舉的這個數大,這個過程可以用單調棧實現,然後列舉每個數找最大就可以了。 

ac**:

1 #include2 #include3 #include4 #include5 #include6 #include7 #include

8 #include9

using

namespace

std;

10 # define ll long

long

11const

int maxn = 1e5+100;12

struct

node

1318 node ( int xx, int

yy)19

23} wakaka[maxn];

24ll a[maxn], qan[maxn];

25 stackq;

26int

main()

2738

int i = 1;39

while( i<=n )

4046

else

4751}52

while( !q.empty() )

53q.pop();

54 i=n;

55while( i >= 1)56

62else

6367

}68 ll maxx=0;69

intl,r;

70ll tmp;

71for(int i=1; i<=n; i++)

7280

}81 printf("

%lld\n%d %d\n

",maxx,l,r);

82return0;

83 }

專題 單調佇列

單調佇列就是佇列中元素滿足單調性 入隊 從隊尾入隊,在入隊的時候刪掉隊尾比當前入隊的元素大 或小 的元素 出隊 出隊是直接把隊頭元素取出 poj2823 sliding window 滑動視窗 給定乙個長為n陣列以及乙個長為k的滑動視窗,視窗每個時刻向後移動一位,求出每個時刻視窗中數字的最大值和最小...

棧和佇列 單調佇列 單調棧

講解部落格鏈結 一 單調棧 1 什麼是單調棧?單調棧是指乙個棧內部元素具有嚴格單調性 單調遞增,單調遞減 的一種資料結構。2 單調棧的兩個性質 滿足從棧頂到棧底具有嚴格的單調性 滿足後進先出的特徵,越靠近棧底的元素越早的進棧。3 元素進棧的過程 對於當前進棧元素x 如果x 棧頂元素,x 進棧。否則 ...

單調佇列 單調棧

參考文章 單調佇列 poj 2823 給定乙個數列,從左至右輸出每個長度為m的數列段內的最小數和最大數。數列長度 n 106 m n n 106,m n n 106 m n 直接暴力求解複雜度在0 mn 可以考慮維護區間最值,單調佇列則是維護區間佇列的強大 單調佇列的定義 單調佇列實現的大致過程 1...