acwing 134 雙端佇列

2021-10-01 19:09:06 字數 786 閱讀 5312

把乙個陣列排序,必須使用雙端佇列,必須從1到n依次處理,問最少要多少個雙端佇列。

和歸併一樣,在乙個佇列裡,按照陣列下標從1到n,把值大的往後扔,小的往前扔。這樣乙個佇列裡面,從前往後,下標肯定是先減後增的。並且:這些佇列也是有序的,也就是說,除了第乙個佇列,乙個佇列的最小值應該是比乙個佇列的最大值大的。找出最少有多少個這樣先減後增的序列就可以了。所以應該是把陣列按照值從小到大排序,然後去找出有多少個下標先減後增序列。

如果值是一樣的,那麼就把它們看成乙個。

#pragma warning(disable:4996)

#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

struct node

;//記錄位置還有值

node a[200005];

bool cmp(node a, node b)

//從小到大排序,值一樣按位置排序

int main()

sort(a + 1, a + 1 + n, cmp);

pre = int_max;//pre初始為最大

for (i = 1; i <= n;)

else

}else

else

}i = j;//下一位

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

return 0;

}

AcWing 134 雙端佇列

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

雙端佇列 Acwing 134 雙端佇列

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

CH134 雙端佇列 題解報告

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