BZOJ 2457: [BeiJing2011]双端队列
还算可以的贪心
将这些数快排
然后标号跟着数走
队列的形成条件就是先递减在递增
还有一个要注意的是相同数字的标号可以交换
其实相同的数字之间标号不是递增就是递减
所以储存相同数字的标号最大值和最小值贪心即可
各种操蛋细节
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdio> 4 #include<algorithm> 5 using namespace std; 6 int i,j,n,m,a,l,b; 7 pair<int,int> num[200003]; 8 int ma[200003]={}; 9 int mi[200003]={}; 10 int main() 11 { 12 scanf("%d",&n); 13 for(i=1;i<=n;i++) 14 scanf("%d",&a),num[i]=make_pair(a,i); 15 sort(num+1,num+1+n); 16 l=0; 17 for(i=1;i<=n;i++) 18 { 19 if(num[i].first!=num[i-1].first||i==1) 20 { 21 ma[l]=num[i-1].second; 22 l++; 23 mi[l]=num[i].second; 24 } 25 } 26 ma[l]=num[n].second; 27 m=0; 28 a=0; 29 b=0; 30 for(i=1;i<=l;i++) 31 { 32 if(ma[i]<a&&b==0) 33 { 34 a=mi[i]; 35 } 36 else 37 { 38 if(mi[i]>a&&b==0) 39 { 40 a=ma[i]; 41 b=1; 42 } 43 else 44 { 45 if(mi[i]>a&&b==1) 46 { 47 a=ma[i]; 48 } 49 else 50 { 51 if(mi[i]<a&&b==0) 52 { 53 a=ma[i]; 54 b=1; 55 } 56 else 57 { 58 m++; 59 a=mi[i]; 60 b=0; 61 } 62 } 63 } 64 } 65 } 66 cout<<m; 67 return 0; 68 }