题目大意:
判断能否通过一次倒置,使序列变为一个递增序列

如果可以,输出倒置那一段的起始点和终点的位置;

 

题目链接:http://codeforces.com/problemset/problem/451/B

 

我自己的做法是用一个数组b保存原数组中小于后一个点的点的下标。

如果b数组中后一个数比前一个数大了超过一,说明有2段递减序列,不成立。

如果均后一个比前一个大1,那么在判断倒置前起始的位置和它倒置后的下一个位置是否递增进行判断,在进行倒置前结束的位置和它倒置后的上一个位置是否递增进行判断

均成立,输出两个位置

 

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 #define N 100100
 5 int a[N],b[N];
 6 int cnt;
 7 int main()
 8 {
 9     int n,flag;
10 
11     while(scanf("%d",&n)!=EOF){
12         flag=1;cnt=0;
13 
14         for(int i=0;i<n;i++) b[i]=-1;
15         for(int i=0;i<n;i++) cin>>a[i];
16         for(int i=0;i<=n-2;i++){
17             if(a[i]>a[i+1]) b[cnt++]=i;
18         }
19         if(cnt>0)
20         {
21             b[cnt]=b[cnt-1]+1;
22             cnt++;
23         }
24 
25         for(int i=0;i<cnt-1;i++){
26             //cout<<b[i]<<endl;
27             if(b[i+1]-b[i]!=1)
28             {
29                 flag=0;
30                 break;
31             }
32         }
33         if(b[0]==-1) {cout<<"yes"<<endl<<1<<' '<<1<<endl;continue;}
34 
35         if(flag==1)
36          {
37               if(b[cnt-1]<n-1) {if(a[b[0]]>a[b[cnt-1]+1])flag=0;}
38               if(b[0]>0){if(a[b[cnt-1]]<a[b[0]-1]) flag=0;}
39          }
40 
41         if(flag==0)cout<<"no"<<endl;
42         else{
43             cout<<"yes"<<endl<<b[0]+1<<' '<<b[cnt-1]+1<<endl;
44         }
45     }
46 
47     return 0;
48 }
View Code

 

 posted on 2014-07-27 16:25  Love风吟  阅读(343)  评论(0编辑  收藏  举报