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;}
阅读全文
1 0