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 }
View Code

 

posted @ 2014-03-22 15:23  wyc  阅读(535)  评论(1编辑  收藏  举报