HDU 5532 Almost Sorted Array (求逆序数)

来源:互联网 发布:铠钾网络招聘 编辑:程序博客网 时间:2024/05/17 21:08

题意:

给你一组数,能否删除一个后使他成为升序或者降序

思路:

正反各求一边逆序数即可。

代码:

#include <bits/stdc++.h>using namespace std;const int MAXN=1e5+10;int a[MAXN];int b[MAXN];int n;bool solve(){    b[n]=a[n];    for(int i=n-1;i>=0;i--) b[i]=min(a[i],b[i+1]);    int disorder=0;    for(int i=1;i<=n;i++)        if(a[i]>b[i])            disorder++;    if(disorder<=1) return 1;    disorder=0;    b[n]=a[n];    for(int i=n-1;i>=0;i--) b[i]=max(a[i],b[i+1]);    for(int i=1;i<=n;i++)        if(a[i]<b[i]) disorder++;    if(disorder<=1) return 1;    for(int i=1;i<=n/2;i++) swap(a[i],a[n+1-i]);    b[n]=a[n];    for(int i=n-1;i>=0;i--) b[i]=min(a[i],b[i+1]);    disorder=0;    for(int i=1;i<=n;i++)        if(a[i]>b[i])            disorder++;    if(disorder<=1) return 1;    disorder=0;    b[n]=a[n];    for(int i=n-1;i>=0;i--) b[i]=max(a[i],b[i+1]);    for(int i=1;i<=n;i++)        if(a[i]<b[i]) disorder++;    if(disorder<=1) return 1;    return 0;}int main(){    int T;    scanf("%d",&T);    while(T--){        scanf("%d",&n);        for(int i=1;i<=n;i++) scanf("%d",&a[i]);        if(solve()) puts("YES");        else puts("NO");    }}