Kiddo: "I have an array A A and a number k k , if you can choose exactly k k elements from A A and erase them, then the remaining array is in non-increasing order or non-decreasing order, we say A A is a magic array. Now I want you to tell me whether A A is a magic array. " Conan: "emmmmm..." Now, Conan seems to be in trouble, can you help him?
InputThe first line contains an integer T indicating the total number of test cases. Each test case starts with two integers n n
and k k
in one line, then one line with n n
integers: A 1 ,A 2 …A n A1,A2…An
.
1≤T≤20 1≤T≤20
1≤n≤10 5 1≤n≤105
0≤k≤n 0≤k≤n
1≤A i ≤10 5 1≤Ai≤105
OutputFor 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> #define rep(i,a,b) for(int i=a;i<=b;i++) using namespace std; const int maxn=100010; int a[maxn],b[maxn]; int main() { int T,N,K,cnt,pos; scanf("%d",&T); while(T--){ scanf("%d%d",&N,&K); rep(i,1,N) scanf("%d",&a[i]); cnt=0; rep(i,1,N) pos=upper_bound(b+1,b+cnt+1,a[i])-b,b[pos]=a[i],cnt=max(pos,cnt); if(cnt+K>=N) puts("A is a magic array."); else { reverse(a+1,a+N+1); cnt=0; rep(i,1,N) pos=upper_bound(b+1,b+cnt+1,a[i])-b,b[pos]=a[i],cnt=max(pos,cnt); if(cnt+K>=N) puts("A is a magic array."); else puts("A is not a magic array."); } } return 0; }