题意:
给你一组数,能否删除一个后使他成为升序或者降序
思路:
正反各求一边逆序数即可。
代码:
#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");
}
}