题意:找出一段逆序!

预存a[]数组到b[]数组。将b排序,然后前后找不同找到区间[l,r],然后推断[l,r]是否逆序就能够了!。当然还得特判本身就是顺序的!!


AC代码例如以下:


#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

int a[100005],b[100005];

int main()
{
    int n;
    int i;
    while(cin>>n)
    {
        memset(a,0,sizeof a);
        memset(b,0,sizeof b);
        for(i=0;i<n;i++)
            {cin>>a[i];
            b[i]=a[i];}
        sort(b,b+n);
        int flag1=1;
        for(i=0;i<n;i++)
        {
            if(a[i]!=b[i])
            {flag1=0;break;}
        }
        if(flag1)
        {
            cout<<"yes"<<endl<<"1"<<" "<<"1"<<endl;
            continue;
        }
        int flag=0;
        int l=0,r=n-1;
        for(i=0;i<n;i++)
        {
            if(a[i]!=b[i])
            {
                l=i;
                break;
            }
        }
         for(i=n-1;i>=0;i--)
        {
            if(a[i]!=b[i])
            {
                r=i;
                break;
            }
        }
        for(i=l+1;i<=r;i++)
        {
            if(a[i]>a[i-1])
            {flag=1;break;}
        }
        if(flag)
            cout<<"no"<<endl;
        else cout<<"yes"<<endl<<l+1<<" "<<r+1<<endl;
    }
    return 0;
}