O( n logn) 求最长上升子序列,正着反着分别求一遍,判断是否符合就好了
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cmath>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <ctype.h>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 100000 + 10;
const int INF = 0x3f3f3f3f;
int T, n, k, l1, l2;
int a[maxn], b[maxn], c[maxn];
void init() {
memset(a, 0, sizeof a);
scanf("%d %d", &n, &k);
for(int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
}
void solve() {
memset(b, INF, sizeof b);
for(int i = 0; i < n; ++i) {
*lower_bound(b, b+n+1, a[i]) = a[i];
}
l1 = lower_bound(b,b+n+1, INF) - b;
memset(c, INF, sizeof c);
for(int i = n-1; i >= 0; --i) {
*lower_bound(c, c+n+1, a[i]) = a[i];
}
l2 = lower_bound(c,c+n+1, INF) - c;
}
int main() {
scanf("%d", &T);
while(T--) {
init();
solve();
if(n - l1 <= k || n-l2 <= k)
puts("A is a magic array.");
else
puts("A is not a magic array.");
}
return 0;
}