hdu6197最长增长序列 二分法

来源:互联网 发布:windows服务器监控 编辑:程序博客网 时间:2024/05/18 01:10

array array array

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 537    Accepted Submission(s): 324


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: A1,A2An.
1T20
1n105
0kn
1Ai105
 

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
34 11 4 3 75 24 1 3 1 26 11 4 3 5 4 6
 

Sample Output
A is a magic array.A is a magic array.A is not a magic array.
 

Source
2017 ACM/ICPC Asia Regional Shenyang Online


#include<iostream>#include<cstdio>#include<algorithm>using namespace std;const int maxn=1e5+10;int a[maxn],b[maxn];int LISS(int n)//最长增长序列 {int num=0;for(int i=0;i<n;i++){if(!num||a[i]>=b[num-1])  b[num++] = a[i];else *upper_bound(b,b+num,a[i]) = a[i];//大于的元素的位置指针 }return num;}int check(int n,int k){if(n-LISS(n)<=k) return 1;for(int i=0;i<n;i++) a[i]=-a[i];if(n-LISS(n)<=k) return 1;return 0;}int main(){int t;scanf("%d",&t);while(t--){int n,k;scanf("%d%d",&n,&k);for(int i=0;i<n;i++)scanf("%d",&a[i]);if(check(n,k))puts("A is a magic array.");else puts("A is not a magic array.");}return 0;}