把乙個陣列排序,必須使用雙端佇列,必須從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 從已有佇列的隊頭或隊尾入隊 對所有的數處理完後,要求這些佇列能夠按照一定的順序連線起來,得到乙個非降的長度...