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.题意:假装都知道题意(其实就是一个序列让你只删掉K个看他能不能成为 non-increasing order or non-decreasing order,序列)。思路:真反求一遍最长上升子序列看剩下个数是不是大于k个即可。代码:#include<bits/stdc++.h> using namespace std; const int maxn=1e5+5; int a[maxn],b[maxn],dp[maxn]; int main() { int n,k; int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&k); int flag=1; memset(b,0,sizeof(b)); memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) scanf("%d",&a[i]); int kk=1; dp[1]=a[1]; for(int i=2;i<=n;i++) { if(a[i]>dp[kk]) { kk++; dp[kk]=a[i]; continue; } int pos=lower_bound(dp+1,dp+kk+1,a[i])-dp; dp[pos]=a[i]; } if(n-kk<=k) flag=0; memset(dp,0,sizeof(dp)); reverse(a+1,a+1+n); int kkk=1; dp[1]=a[1]; for(int i=2;i<=n;i++) { if(a[i]>dp[kkk]) { kkk++; dp[kkk]=a[i]; continue; } int pos=lower_bound(dp+1,dp+kkk+1,a[i])-dp; dp[pos]=a[i]; } if(n-kkk<=k) flag=0; if(!flag) puts("A is a magic array."); else puts("A is not a magic array."); } return 0; }