sherry 現在碰到了乙個棘手的問題,有n個整數需要排序。
sherry 手頭能用的工具就是若干個雙端佇列。
她需要依次處理這 n 個數,對於每個數, sherry 能做以下兩件事:
1. 新建乙個雙端佇列,並將當前數作為這個佇列中的唯一的數;
2. 將當前數放入已有的佇列的頭之前或者尾之後。
對所有的數處理完成之後, sherry 將這些佇列排序後就可以得到乙個非降的序列。
input第一行包含乙個整數 n ,表示整數的個數。接下來的 n 行每行包含乙個整數 di
,其中 di
表示所需處理的整數。output
其中只包含一行,為 sherry 最少需要的雙端佇列數。
sample input
6 3 6 0 9 6 3
sample output
2
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9view code//#include
10//
#include
11#define r(a,b,c) for(register int (a)=(b);(a)<=(c);++(a))
12#define nr(a,b,c) for(register int (a)=(b);(a)>=(c);--(a))
13#define ii inline int
14#define iv inline void
15#define il inline long long
16#define ib inline bool
17#define inf 0x7ffffff
18#define re register
19#define ll long long
20#define max(a,b) ((a)>(b)?(a):(b))
21#define min(a,b) ((a)
22#define cmin(a,b) ((a)=(a)
23#define cmax(a,b) ((a)=(a)>(b)?(a):(b))
24#define fill(a,b) memset((a),(b),sizeof((a)))
25#define d_e_line printf("\n-------------\n");
26#define d_e(x) printf("\n______%d_______\n",x)
27#define pause system("pause")
28using
namespace
std;
29const
int n=200005;30
ii read()
36 templateiv print(tp x)
41#define down 0
42#define up 1
43struct
node
49 }a[n<<1
];50
intmx[n],mi[n];
51int
main();
55 sort(a+1,a+n+1
);56 r(i,1
,n)57
if(i==1||a[i].w!=a[i-1
].w)
58 mx[cnt]=a[i-1
].id,
59 mi[++cnt]=a[i].id;
60 mx[cnt]=a[n].id;
61 r(i,1
,cnt)
68else
if(flag==up)74}
75print(ans);
76return0;
77 }
BZOJ 2457雙端佇列題解
我們之前學習了如何使用stl中的佇列 現在我們來看一道與佇列有關的神奇的題 看似佇列而非為佇列 雙端佇列 分析 如果現在有一段序列 ai,ai 1,ai 2,aj 1,aj 滿足該雙端佇列的要求,即滿足 aj 1 ai 1 如下 include include include include inc...
BZOJ 2457 雙端佇列 思維
bzo j2457雙端 佇列bz oj24 57雙端 佇列de scri ptio ndes crip tion sherry現在碰到了乙個棘手的問題,有 個整數需要排序。sherry手頭能用的工具就是若干個雙端佇列。她需要依次處理這n個數,對於每個數,sherry能做以下兩件事 1 新建乙個雙端佇...
BZOJ2457 雙端佇列 題解
本題直接求解十分困難,因為在不知道整個序列的數字規律時當前所作決策都無法保證最優性。考慮正難則反,題目轉化為將乙個非降序列分成盡量少的幾段,讓每段對應原問題的雙端佇列。先將原陣列排序,由於原陣列下標對應了插入的順序,那麼根據雙端佇列的性質,被劃分出的每一段的下標都應該滿足單谷性質 最先插入的在最中間...