D:array array array

来源:互联网 发布:cg软件下载 编辑:程序博客网 时间:2024/06/06 11:38

D:array array array
这里写图片描述


其实转换一下就变成了求最长不上升(下降)子序列
由于Ai<=105,就用树状数组存就好了
每次查询小于等于 Ai 最长是多少,更新当前就好了

#include <bits/stdc++.h>using namespace std;const int maxn = 1e5+10;int f[maxn], a[maxn], n, m;void init() {//  memset(f, 0, sizeof(f));    scanf("%d %d", &n, &m);    for (int i = 1; i <= n; i++) scanf("%d", &a[i]);}void insert(int x, int y) {    while (x < maxn) {        f[x] = max(f[x], y);        x = x+(x & (-x));    }}int find(int x) {    int t = 0;    while (x > 0) {        t = max(t, f[x]);        x = x-(x & (-x));    }    return t;}bool work() {    memset(f, 0, sizeof(f));    int len = 0;    for (int i = 1; i <= n; i++) {        int t = find(a[i])+1;        len = max(len, t);        insert(a[i], t);    }    if (len >= n-m) return true;    return false;}void turn() {    for (int i = 1; i*2 <= n; i++) {        swap(a[i], a[n-i+1]);    }}int main() {    freopen("input.txt","r",stdin);    int T;    scanf("%d", &T);    while (T--) {        init();        if (work()) {            printf("A is a magic array.\n");            continue;        }        turn();        if (work()) {            printf("A is a magic array.\n");            continue;        }        printf("A is not a magic array.\n");    }}
原创粉丝点击