51nod 1153 選擇子串行(單調佇列)

2021-10-23 17:26:17 字數 932 閱讀 4480

題目

長度為n的整數陣列a,所有的數均不相同,假設下標從0開始。找到乙個最長的陣列b,b陣列的長度為k,數值範圍是0 - n - 1,記錄的是a陣列的下標。滿足a[b[0]] > a[b[1]] > a[b[2]] >…a[b[k]],並且對任意連續的兩項b[i]及b[i + 1],滿足min(b[i],b[i + 1]) < j < max(b[i],b[i + 1]) 均有a[j] < a[b[i + 1]] ,求最大的k。例如:9, 10, 2, -1, 3, -5, 0, -3, 1, 12, 5, 8, -2, 6, 4。可以選出:12, 10, 3, 1, 0, -3。對應的下標為:9, 1, 4, 8, 6, 7(就是b陣列),輸出6。

輸入第1行:乙個數n,表示a陣列的長度。(1 <= n <= 50000)

第2 - n + 1行:每行1個數對應a陣列的元素ai(0 < ai < 109)

輸出輸出b陣列最長的長度k。

輸入樣例159

102-13

-50-31

1258-2

64

#include

#include

#include

#include

using namespace std;

struct node };

intmain()

num++

;int size = buf.

size()

+1; num =

max(num, size)

; buf.

push

(node

(a, num));

result =

max(result, num);}

cout << result << endl;

return0;

}

51nod 1153 選擇子串行

長度為n的整數陣列a,所有的數均不相同,假設下標從0開始。找到乙個最長的陣列b,b陣列的長度為k,數值範圍是0 n 1,記錄的是a陣列的下標。滿足a b 0 a b 1 a b 2 a b k 並且對任意連續的兩項b i 及b i 1 滿足min b i b i 1 j max b i b i 1 ...

選擇子串行 51Nod 1153

長度為n的整數陣列a,所有的數均不相同,假設下標從0開始。找到乙個最長的陣列b,b陣列的長度為k,數值範圍是0 n 1,記錄的是a陣列的下標。滿足ab 0 ab 1 ab 2 ab k 並且對任意連續的兩項b i 及bi 1 滿足min b i bi 1 j max b i bi 1 均有aj ab...

51nod 1153 選擇子串行

51nod 選擇子串行 這道題是 bunny 學長在給我們的模擬賽中的一道題。食用單調棧,處理每個數 a i 左右第乙個比自己大的數的下標 left i right i 並且建兩條有向邊 i,left i i,right i 處理完畢後得到乙個 dag 然後求此圖的拓撲序。由於都是小數連大數,所以可...