HDU

来源:互联网 发布:如何给给淘宝号升级 编辑:程序博客网 时间:2024/06/09 19:45

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;}