Problem Description
One day, Kaitou Kiddo had stolen a priceless diamond ring. But detective Conan blocked Kiddo's path to escape from the museum. But Kiddo didn't want to give it back. So, Kiddo asked Conan a question. If Conan could give a right answer, Kiddo would return the ring to the museum.
Kiddo: "I have an array A and a number k , if you can choose exactly k elements from A and erase them, then the remaining array is in non-increasing order or non-decreasing order, we say A is a magic array. Now I want you to tell me whether A is a magic array. " Conan: "emmmmm..." Now, Conan seems to be in trouble, can you help him?
Kiddo: "I have an array A and a number k , if you can choose exactly k elements from A and erase them, then the remaining array is in non-increasing order or non-decreasing order, we say A is a magic array. Now I want you to tell me whether A is a magic array. " Conan: "emmmmm..." Now, Conan seems to be in trouble, can you help him?
Input
The first line contains an integer T indicating the total number of test cases. Each test case starts with two integers
n
and
k
in one line, then one line with
n
integers:
A1,A2…An
.
1≤T≤20
1≤n≤105
0≤k≤n
1≤Ai≤105
1≤T≤20
1≤n≤105
0≤k≤n
1≤Ai≤105
Output
For each test case, please output "A is a magic array." if it is a magic array. Otherwise, output "A is not a magic array." (without quotes).
Sample Input
3 4 1 1 4 3 7 5 2 4 1 3 1 2 6 1 1 4 3 5 4 6
Sample Output
A is a magic array. A is a magic array. A is not a magic array.
题意:
给一个长度为n的序列,判断是否可以删除k个数,使其变成不上升序列或不下降序列。
思路:
其实就是求最长不上升(不下降)子序列,判断 n-最长子序列的长度<=k。
//
// main.cpp
// 1004
//
// Created by zc on 2017/9/10.
// Copyright © 2017年 zc. All rights reserved.
//
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=110000;
int n,k,a[N],d[N];
int main(int argc, const char * argv[]) {
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
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=upper_bound(d+1,d+len+1,a[i])-d;
d[j]=a[i];
}
}
if(n-len<=k)
{
printf("A is a magic array.\n");
continue;
}
d[1]=a[1];
len=1;
for(int i=2;i<=n;i++)
{
if(a[i]<=d[len]) d[++len]=a[i];
else
{
int j=upper_bound(d+1,d+len+1,a[i])-d;
d[j]=a[i];
}
}
if(n-len<=k)
{
printf("A is a magic array.\n");
}
else
{
printf("A is not a magic array.\n");
}
}
}