题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6197
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

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?

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: 

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.

Problem solving report:

Description: 给了一个序列,长度为n,问是否可以删去k个字符,使之成为非递增或者非递减子序列。
Problem solving: 因为是非递增或者非递减,所以我们需要正反都要求一次,选其中最大的,然后判断长度是否大于等于n-k就行了。

Accepted Code:

/* 
 * @Author: lzyws739307453 
 * @Language: C++ 
 */
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 5;
int spt[MAXN], dp[MAXN];
int slove(int p, int l, int r) {
    int mid;
    while (l <= r) {
        mid = l + r >> 1;
        if (p >= dp[mid])
            l = mid + 1;
        else r = mid - 1;
    }
    return l;
}
int LIS(int sp[], int n) {
    int len = 0;
    dp[len++] = sp[0];
    for (int i = 1; i < n; i++) {
        if (sp[i] >= dp[len - 1])
            dp[len++] = sp[i];
        else {
            int p = slove(sp[i], 0, len - 1);
            dp[p] = sp[i];
        }
    }
    return len;
}
int main() {
    int t, n, k;
    scanf("%d", &t);
    while (t--) {
        scanf("%d%d", &n, &k);
        for (int i = 0; i < n; i++)
            scanf("%d", &spt[i]);
        int len = LIS(spt, n);
        //printf("%d\n", len);
        reverse(spt, spt + n);
        len = max(len, LIS(spt, n));
        //printf("%d\n", len);
        if (len >= n - k)
            printf("A is a magic array.\n");
        else printf("A is not a magic array.\n");
    }
    return 0;
}