#include <stdio.h> #include <string.h> #include <algorithm> #include <iostream> #include <vector> #define siz 100005 using namespace std; int n,k; int gp[siz]; int ans[siz],len,Max; int ar[siz]; /* 二分查找。 注意,这个二分查找是求下界的; (什么是下界?详情见《算法入门经典》 P145) 即返回 >= 所查找对象的第一个位置(想想为什么) 也可以用STL的lowe_bound二分查找求的下界 */ int binary_search1(int i){ int left,right,mid; left=0,right=len; while(left<right){ mid = left+(right-left)/2; // cout<<ans[mid]<<"----------&&&&&&&-------"<<mid<<endl; if(ans[mid]>gp[i]) right=mid; else left=mid+1; } return left; } int binary_search2(int i){ int left,right,mid; left=0,right=Max; while(left<right){ mid = left+(right-left)/2; //cout<<ar[mid]<<"--------&&&&&&&&&&&&&---------"<<mid<<endl; if(ar[mid]<gp[i]) right=mid; else left=mid+1; } return left; } void solve(){ //int Max,Min; ans[1] = gp[1]; len = 1; for(int i = 2;i<=n;i++){ if(gp[i] >= ans[len]) ans[++len] = gp[i]; else{ int pos = binary_search1(i); ans[pos] = gp[i]; //cout<<pos<<" "<<ans[pos]<<endl; } } // cout<<len<<"--------------"<<endl; Max = 1; ar[1] = gp[1]; for(int i = 2;i<=n;i++){ if(gp[i] <= ar[Max]) ar[++Max] = gp[i]; else{ int pos = binary_search2(i); ar[pos] = gp[i]; } } if(n - len <=k || n - Max <= k){ puts("A is a magic array."); } else{ puts("A is not a magic array."); } //cout<<len<<" "<<Max<<endl; } int main() { int T; scanf("%d",&T); ar[0] = 1000000; while(T--){ scanf("%d%d",&n,&k); for(int i = 1;i <= n; i++){ scanf("%d",&gp[i]); } /*for(int i=1;i<=n;i++){ cout<<gp[i]<<"&&"; } cout<<endl;*/ solve(); /*for(int i=0;i<=n;i++){ cout<<ans[i]<<"--"; } cout<<endl;*/ } return 0; }
n*log(n)的最长上升子序列
最新推荐文章于 2023-11-26 21:55:38 发布