Sherry现在碰到了一个棘手的问题,有N个整数需要排序。
Sherry手头能用的工具就是若干个双端队列。
她需要依次处理这N个数,对于每个数,Sherry能做以下两件事:
1.新建一个双端队列,并将当前数作为这个队列中的唯一的数;
2.将当前数放入已有的队列的头之前或者尾之后。
对所有的数处理完成之后,Sherry将这些队列排序后就可以得到一个非降的序列。
100%的数据中N≤200000。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cmath> 5 6 #define maxn 200100 7 8 using namespace std; 9 10 struct node{ 11 int x,pos; 12 }a[maxn]; 13 14 int mx[maxn],mi[maxn]; 15 16 inline int in() 17 { 18 int x=0,f=1;char ch=getchar(); 19 while((ch<‘0‘||ch>‘9‘)&&ch!=‘-‘)ch=getchar(); 20 if(ch==‘-‘)f=-1,ch=getchar(); 21 while(ch<=‘9‘&&ch>=‘0‘)x=x*10+ch-‘0‘,ch=getchar(); 22 return x*f; 23 } 24 25 bool cmp(const node A,const node B){return A.x<B.x||(A.x==B.x&&A.pos<B.pos);} 26 27 int main() 28 { 29 int n,cnt=0,ans=0,h=99999999,b=1; 30 n=in(); 31 for(int i=1;i<=n;i++)a[i].x=in(),a[i].pos=i; 32 sort(1+a,1+a+n,cmp); 33 for(int i=1;i<=n;i++) 34 if(i==1||a[i].x!=a[i-1].x) 35 { 36 mx[cnt]=a[i-1].pos; 37 mi[++cnt]=a[i].pos; 38 } 39 mx[cnt]=a[n].pos; 40 for(int i=1;i<=cnt;i++) 41 { 42 if(!b) 43 { 44 if(h>mx[i])h=mi[i]; 45 else h=mx[i],b=1; 46 } 47 else{ 48 if(h<mi[i])h=mx[i]; 49 else h=mi[i],b=0,ans++; 50 } 51 } 52 printf("%d",ans); 53 return 0; 54 } 55
【贪心】Bzoj 2457:[BeiJing2011]双端队列
原文:http://www.cnblogs.com/tuigou/p/4875735.html