HDU3308 LCIS

来源:互联网 发布:win7不能网络共享 编辑:程序博客网 时间:2024/05/16 05:24

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308

线段树单点更新+区间合并,特殊的地方就是合并的时候考虑两个相邻的数是否符合条件,判断一下再决定是否合并

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define lson l, m, rt<<1#define rson m + 1, r, rt<<1|1const int maxn = 111111;int llci[maxn<<2], rlci[maxn<<2], mlci[maxn<<2];int a[maxn];void PushUp(int l, int r, int rt){    llci[rt] = llci[rt<<1];    rlci[rt] = rlci[rt<<1|1];    mlci[rt] = max(mlci[rt<<1], mlci[rt<<1|1]);    int m = (l + r) >> 1;    if (a[m] < a[m + 1]){        if (llci[rt] == m - l + 1) llci[rt] += llci[rt<<1|1];        if (rlci[rt] == r - m) rlci[rt] += rlci[rt<<1];        mlci[rt] = max(mlci[rt], llci[rt<<1|1] + rlci[rt<<1]);    }}void build(int l, int r, int rt){    if (l == r){        llci[rt] = rlci[rt] = mlci[rt] = 1;        return;    }    int m = (l + r) >> 1;    build(lson);    build(rson);    PushUp(l, r, rt);}void update(int x, int c, int l, int r, int rt){    if (l == r){        a[l] = c;        return;    }    int m = (l + r) >> 1;    if (x <= m) update(x, c, lson);    else update(x, c, rson);    PushUp(l, r, rt);}int query(int ll, int rr, int l, int r, int rt){    if (ll == l && rr == r) return mlci[rt];    int m = (l + r) >> 1;    if (rr <= m) return query(ll, rr, lson);    else if (ll > m) return query(ll, rr, rson);    else{        int x = query(ll, m, lson);        int y = query(m + 1, rr, rson);        int z = 0;        if (a[m] < a[m + 1]){            z += min(llci[rt<<1|1], rr - m);            z += min(rlci[rt<<1], m - ll + 1);        }        return max(x, max(y, z));    }}int main(){    int t;    scanf("%d", &t);    while (t--){        int n, m;        scanf("%d%d", &n, &m);        for (int i = 1; i <= n; i++) scanf("%d", &a[i]);        build(1, n, 1);        char op[2]; int x, y;        while (m--){            scanf("%s%d%d", op, &x, &y);            x += 1;            if (op[0] == 'U') update(x, y, 1, n, 1);            else{                y += 1;                int ans = query(x, y, 1, n, 1);                printf("%d\n", ans);            }        }    }    return 0;}