目录
T1 排序2
思路1
求最长不下降子序列。观察可以发现如果这个序列最长不下降子序列的长度小于总长度-1,那么就无法通过一次操作排好序。
对于这个数据要用 nlongn 的时间复杂度求出最长不下降子序列,推荐lvmememe的博客
代码1
#include<cstdio>
#include<algorithm>
using namespace std;
int a[1000006];
int d[1000006];
int main()
{
int n;
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
if(n==0)
{
printf("0\n");
return 0;
}
d[1]=a[1];
int len=1;
for(int i=2;i<=n;i++)
{
if(a[i]>=d[len])d[++len]=a[i];
else
{
int j=lower_bound (d+1,d+len+1,a[i])-d;
d[j]=a[i];
}
}
printf(len+1>=n?"YES":"NO");
return 0;
}
思路2
模拟(大暴力)
代码2
某dalao的代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 1000010
using namespace std;
int n,s,a[N];
int main()
{
scanf("%d",&n);
for(int i=0;i<n;++i)
scanf("%d",a+i);
a[n]=0x7fffffff;
for(int i=1;i<n;++i)
{
if(a[i]>=a[i-1]) continue;
s++;
if(a[i-2]>a[i]&&a[i-2]>a[i+1]) {puts("NO"); return 0;}
if(a[i-1]>a[i+1]) a[i]=a[i-2];
else a[i]=a[i-1];
if(s>1){puts("NO"); return 0;}
}
puts("YES");
}