问一个长度为n的序列,去掉K个数后,能否形成最长上升子序列或者最长下降子序列
所以就是求最长上升子序列的问题,求出两个序列的最大长度后,看看加上K能否>=n
数据量是10^5,所以要用nlogn优化的LIS算法
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=1e5+10;
int put(int arr[], int l, int r, int key)//在arr[l...r]中二分查找插入位置
{
int mid;
if (arr[r] <= key)
return r + 1;
while (l < r)
{
mid = l + (r - l) / 2;
if (arr[mid] <= key)
l = mid + 1;
else
r = mid;
}
return l;
}
int B[N];
int LIS(int A[], int n)
{
int i = 0, len = 1 ,next;
B[1] = A[0];
for (i = 1;i < n;i++)
{
int next = put(B, 1, len, A[i]);
B[next] = A[i];
if (len < next) len = next;
}
return len;
}
int a[N],b[N];
int main()
{
int n,T,k;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n;i++)
b[i]=a[n-i-1];
int ans1=LIS(a,n);
int ans2=LIS(b,n);
if(ans1+k>=n||ans2+k>=n) printf("A is a magic array.\n");
else printf("A is not a magic array.\n");
}
return 0;
}