雙端佇列 Acwing 134 雙端佇列

2022-04-29 03:27:06 字數 1330 閱讀 2250

達達現在碰到了乙個棘手的問題,有n個整數需要排序。

達達手頭能用的工具就是若干個雙端佇列。

她從1到n需要依次處理這n個數,對於每個數,達達能做以下兩件事:

1.新建乙個雙端佇列,並將當前數作為這個佇列中的唯一的數;

2.將當前數放入已有的佇列的頭之前或者尾之後。

對所有的數處理完成之後,達達將這些佇列按一定的順序連線起來後就可以得到乙個非降的序列。

請你求出最少需要多少個雙端序列。

輸入格式

第一行輸入整數n,代表整數的個數。

接下來n行,每行包括乙個整數di,代表所需處理的整數。

輸出格式

輸出乙個整數,代表最少需要的雙端佇列數。

資料範圍

1≤n≤200000

輸入樣例:63

6096

3輸出樣例:

2

#include

using

namespace std;

deque<

int>q[

1010];

const

int n=

200006

,inf=

0x3f3f3f3f

;pair<

int,

int>a[n]

;int n;

vector<

int>p[n]

;int

main()

sort

(a+1

,a+n+1)

;//按數值給序號排序;

int t=0;

//準備工作

for(

int i=

1;i<=n;i++

)for

(int i=

1;i<=t;i++

)sort

(p[i]

.begin()

,p[i]

.end()

);bool flag=0;

/*判斷上公升或下降的趨勢,一開始判它為下降趨勢。

(因為下乙個趨勢一定是上公升的,但現在是第乙個數值佇列,沒有趨勢。

要為上公升趨勢準備)

*/int num=inf,ans=1;

/*ans設為1,此題意在找拐點,找到拐點後要加1才算是佇列數量,

因此開始為1;*/

for(

int i=

1;i<=t;i++)}

else}}

cout

}

這道題重點在找「拐點」,與佇列沒有半毛錢關係,超坑。

AcWing 134 雙端佇列

題目描述 達達現在碰到了乙個棘手的問題,有n個整數需要排序。達達手頭能用的工具就是若干個雙端佇列。她從1到n需要依次處理這n個數,對於每個數,達達能做以下兩件事 1 新建乙個雙端佇列,並將當前數作為這個佇列中的唯一的數 2 將當前數放入已有的佇列的頭之前或者尾之後。對所有的數處理完成之後,達達將這些...

acwing 134 雙端佇列

把乙個陣列排序,必須使用雙端佇列,必須從1到n依次處理,問最少要多少個雙端佇列。和歸併一樣,在乙個佇列裡,按照陣列下標從1到n,把值大的往後扔,小的往前扔。這樣乙個佇列裡面,從前往後,下標肯定是先減後增的。並且 這些佇列也是有序的,也就是說,除了第乙個佇列,乙個佇列的最小值應該是比乙個佇列的最大值大...

CH134 雙端佇列 題解報告

題目傳送門 題目大意 用若干個雙端佇列給 n 個整數排序,依次處理這 n 個數,對於每個數 a i 可以進行兩種操作 1.新建乙個雙端佇列,並將 a i 作為這個佇列中唯一的數 2.把 a i 從已有佇列的隊頭或隊尾入隊 對所有的數處理完後,要求這些佇列能夠按照一定的順序連線起來,得到乙個非降的長度...