Almost Sorted Array
- 链接
HDU 题目链接
- 题解
这题主要的思想就是运用前缀和后缀数组,判断删去一个之后剩余的部分是否是有序的。满足就是YES,没有一个满足就是NO。
第一次用这个编辑器写,感觉怪怪的…
- 代码
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int T,n,a[100005],pre1[100005],sim1[100005],pre2[100005],sim2[100005];
int main()
{
scanf("%d",&T);
while (T--)
{
memset(a,0,sizeof(a));
memset(pre1,0,sizeof(pre1));
memset(sim1,0,sizeof(sim1));
memset(pre2,0,sizeof(pre2));
memset(sim2,0,sizeof(sim2));
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
pre1[0]=1; pre2[0]=1; pre1[1]=1; sim1[n]=1; pre2[1]=1; sim2[n]=1;
sim1[n+1]=1; sim2[n+1]=1;
for (int i=2;i<=n;i++)
{
if (a[i]>=a[i-1] && pre1[i-1]) pre1[i]=1;
if (a[i]<=a[i-1] && pre2[i-1]) pre2[i]=1;
}
for (int i=n-1;i>=1;i--)
{
if (a[i]<=a[i+1] && sim1[i+1]) sim1[i]=1;
if (a[i]>=a[i+1] && sim2[i+1]) sim2[i]=1;
}
int f=0;
for (int i=2;i<=n-1;i++)
{
if (pre1[i-1] && sim1[i+1] && a[i+1]>=a[i-1]) f=1;
if (pre2[i-1] && sim2[i+1] && a[i-1]>=a[i+1]) f=1;
}
if (sim1[2] || sim2[2]) f=1;
if (pre1[n-1] || pre2[n-1]) f=1;
if (f) printf("YES\n");
else printf("NO\n");
}
return 0;
}