單調佇列(題目)

2021-10-08 18:55:28 字數 2127 閱讀 2634

題意:

指的是海象進行排隊,但是他們會因為年齡有不愉快的程度。

如果是年輕的海象比他靠前他就會產生不愉快的程度,距離越遠不愉快的程度越大。

輸出不愉快的程度,如果沒有不愉快則輸出-1.

題目**:

#include

#include

#include

#define m 100010

using

namespace std;

int a[m]

,tail,ans[m]

;struct node

;//用x代表年齡,i代表位置即下標

node q[m]

;int

erfen

(int x)

//二分法的方法對其中一部分的查詢

else

}return l;

}int

main()

for(

int i=n;i>

0;i--

)else

}for

(int i=

1;i)printf

("%d\n"

,ans[n]);

}}

題意:

題目**:

官方**:

官方**中運用的vector的語法,帶有二分法的感覺

#include

using

namespace std;

intmain()

vector<

int>

ans(

3* n)

; vector<

int> st_max;

vector<

int> st_min;

for(

int i =

3* n -

1; i >=

0; i--

)while

(!st_min.

empty()

&& a[st_min.

back()

]> a[i]

)int low =

0, high =

(int

) st_min.

size()

;while

(low < high)

else

}int nxt =

3* n;

if(low >0)

if(!st_max.

empty()

)if(nxt <

3* n && a[nxt]

>= a[i]

)else

st_min.

push_back

(i);

st_max.

push_back

(i);

}for

(int i =

0; i < n; i++

) cout <<

(ans[i]==3

* n ?-1

: ans[i]

- i);}

cout <<

'\n'

;return0;

}

#include

using

namespace std;

int a[

300005

],q[

300005];

int ans[

100005];

intmain()

int r =1;

for(

int i =

1; i <= n; i++)if

( r >

3* n ) ans[i]=-

1;else ans[i]

= r - i;

}for

(int i =

1; i <= n; i++

)return0;

}

單調棧,單調佇列

大多數借鑑了 單調佇列是什麼呢?可以直接從問題開始來展開。poj 2823 給定乙個數列,從左至右輸出每個長度為m的數列段內的最小數和最大數。數列長度 n 106,m n 我們知道,解法 在暴力列舉的過程中,有乙個地方是重複比較了,就是在找當前的f i 的時候,i的前面其它m 1個數在算f i 1 ...

單調棧 單調佇列

單調棧 單調佇列是在棧和佇列的基礎上加上單調結構的資料結構。如果乙個元素入棧或入隊,他會檢查之前的元素,如果之前的元素不可能是答案的解,那麼就彈出元素,使得當前元素入棧或入隊。leetcode 239 滑動視窗最大值 此題是單調佇列,每次遇到乙個元素,一直從隊尾彈出,直到隊尾元素大於該元素為止。還需...

單調棧 單調佇列

啊學完了來寫個總結吧 顧名思義,單調,就是指色彩單一某乙個容器裡面的元素都是遞增或遞減的,而單調棧和單調佇列就是這個容器。單調棧 單調棧模板 其他的我就不說了,講下為什麼單調棧是從後往前掃瞄 當我們在判斷乙個數後面第乙個比它大的數時,前提是後面的數已經被處理了,所以我們要從後往前掃瞄。我做了兩種做法...