TLE0pts 求调
查看原帖
TLE0pts 求调
860817
Starstream楼主2023/12/18 17:27

rt

#include <iostream>
#include <cstring>

using namespace std;

const int N = 500010, INF = 1e9;

struct Splay_Node
{
    int s[2], p, v;
    bool flag, chg;
    int size, sum, ms, ls, rs;

    void init(int _v, int _p)
    {
        s[0] = s[1] = 0, v = _v, p = _p;
        flag = chg = false, size = 1;
        sum = ms = v, ls = rs = max(0, v);
    }
}tr[N];

int root, n, m;
int bin[N], top;
int w[N];

void pushup(int x)
{
    Splay_Node &u = tr[x], &l = tr[tr[x].s[0]], &r = tr[tr[x].s[1]];
    u.size = l.size + r.size + 1;
    u.sum = l.sum + r.sum + u.v;
    u.ls = max(l.ls, l.sum + u.v + r.ls);
    u.rs = max(r.rs, r.sum + u.v + l.rs);
    u.ms = max(max(l.ms, r.ms), l.rs + u.v + r.ls);
}

void pushdown(int x)
{
    Splay_Node &u = tr[x], &l = tr[tr[x].s[0]], &r = tr[tr[x].s[1]];
    if (u.chg)
    {
        u.chg = u.flag = false;
        if (u.s[0]) l.chg = true, l.v = u.v, l.sum = l.v * l.size;
        if (u.s[1]) r.chg = true, r.v = u.v, r.sum = r.v * r.size;
        if (u.v > 0)
        {
            if (u.s[0]) l.ms = l.ls = l.rs = l.sum;
            if (u.s[1]) r.ms = r.ls = r.rs = r.sum;
        }
        else
        {
            if (u.s[0]) l.ms = l.v, l.ls = l.rs = 0;
            if (u.s[1]) r.ms = r.v, r.ls = r.rs = 0;
        }
    }
    else if (u.flag)
    {
        l.flag = !l.flag, r.flag = !r.flag;
        swap(l.s[0], l.s[1]), swap(r.s[0], r.s[1]);
        swap(l.ls, l.rs), swap(r.ls, r.rs);
        u.flag = 0;
    }
}

void rotate(int x)
{
    int y = tr[x].p, z = tr[y].p;
    int k = tr[y].s[1] == x;
    tr[z].s[tr[z].s[1] == y] = x, tr[x].p = z;
    tr[y].s[k] = tr[x].s[k ^ 1], tr[tr[x].s[k ^ 1]].p = y;
    tr[x].s[k ^ 1] = y, tr[y].p = x;
    pushup(y), pushup(x);
}

void splay(int x, int k)
{
    while (tr[x].p != k)
    {
        int y = tr[x].p, z = tr[y].p;
        if (z != k)
            if ((tr[y].s[1] == x) ^ (tr[z].s[1] == y)) rotate(x);
            else rotate(y);
        rotate(x);
    }
    if (!k) root = x;
}

int kth(int k)
{
    int u = root;
    while (u)
    {
        if (tr[tr[u].s[0]].size >= k) u = tr[u].s[0];
        else if (tr[tr[u].s[0]].size + 1 == k) return splay(u, 0), u;
        else k -= tr[tr[u].s[0]].size + 1, u = tr[u].s[1];
    }
    return -1;
}

int build(int l, int r, int p)
{
    if (l >= r) return 0;
    int mid = l + r >> 1;
    int u = bin[top -- ];
    tr[u].init(w[mid], p);
    tr[u].s[0] = build(l, mid - 1, u);
    tr[u].s[1] = build(mid + 1, r, u);
    pushup(u);
    return u;
}

void dfs(int u)
{
    if (tr[u].s[0]) dfs(tr[u].s[0]);
    if (tr[u].s[1]) dfs(tr[u].s[1]);
    bin[ ++ top] = u;
}

int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i ++ ) scanf("%d", &w[i]);
    for (int i = 1; i < N; i ++ ) bin[ ++ top] = i;
    w[0] = w[n + 1] = -INF, tr[0].ms = -INF;
    root = build(0, n + 1, 0);

    char op[10]; int pos, tot, x;
    while (m -- )
    {
        scanf("%s", op);
        if (*op == 'I')
        {
            scanf("%d%d", &pos, &tot);
            for (int i = 1; i <= tot; i ++ ) scanf("%d", &w[i]);
            int l = kth(pos + 1), r = kth(pos + 2);
            splay(l, 0), splay(r, l);
            int u = build(1, tot, r);
            tr[r].s[0] = u;
            pushup(r), pushup(l);
        }
        else if (*op == 'D')
        {
            scanf("%d%d", &pos, &tot);
            int l = kth(pos + 1), r = kth(pos + tot + 1);
            splay(l, 0), splay(r, l);
            dfs(tr[r].s[0]);
            tr[r].s[0] = 0;
            pushup(r), pushup(l);
        }
        else if (op[2] == 'K')
        {
            scanf("%d%d%d", &pos, &tot, &x);
            int l = kth(pos + 1), r = kth(pos + tot + 1);
            splay(l, 0), splay(r, l);
            Splay_Node &u = tr[tr[r].s[0]];
            u.chg = true, u.v = x, u.sum = u.size * x;
            if (x > 0) u.ms = u.rs = u.ls = u.sum;
            else u.ms = x, u.rs = u.ls = 0;
            pushup(r), pushup(l);
        }
        else if (*op == 'R')
        {
            scanf("%d%d", &pos, &tot);
            int l = kth(pos + 1), r = kth(pos + tot + 1);
            splay(l, 0), splay(r, l);
            Splay_Node &u = tr[tr[r].s[0]];
            u.flag = !u.flag;
            swap(u.s[0], u.s[1]), swap(u.ls, u.rs);
            pushup(r), pushup(l);
        }
        else if (*op == 'G')
        {
            scanf("%d%d", &pos, &tot);
            int l = kth(pos + 1), r = kth(pos + tot + 1);
            splay(l, 0), splay(r, l);
            printf("%d\n", tr[tr[r].s[0]].sum);
        }
        else printf("%d\n", tr[root].ms);
    }

    return 0;
}
2023/12/18 17:27
加载中...