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
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: A
1
,A
2
…A
n![]()
.
1≤T≤20![]()
1≤n≤10
5![]()
![]()
0≤k≤n![]()
1≤A
i
≤10
5![]()
![]()
1≤T≤20
1≤n≤10
0≤k≤n
1≤A
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.
类似于最长递增子序列
正方来一次,反向来一次。
#include <bits/stdc++.h> using namespace std; const int MAXN = 1e5+10; int a[MAXN]; int b[MAXN]; int t[MAXN]; int len1,len2; int main() { int T,n,k; scanf("%d",&T); while(T--) { memset(b,0,sizeof(b)); scanf("%d %d",&n,&k); for(int i = 0; i < n; ++i) { scanf("%d",&a[i]); t[n-i-1] = a[i]; } b[1] = a[0]; int len = 1,j; for(int i = 1; i < n; ++i) { if(a[i] >= b[len]) b[++len] = a[i]; else { j = lower_bound(b+1,b+1+len,a[i])-b; b[j] = a[i]; } } len1 = n-len; memset(b,0,sizeof(b)); b[1] = t[0]; len = 1; for(int i = 1; i < n; ++i) { if(t[i] >= b[len]) b[++len] = t[i]; else { j = lower_bound(b+1,b+1+len,t[i])-b; b[j] = t[i]; } } len2 = n-len; if(k >= len1 || k >= len2) printf("A is a magic array.\n"); else printf("A is not a magic array.\n"); } return 0; }