线段树求调,玄关
查看原帖
线段树求调,玄关
744989
kunkunge楼主2025/1/25 16:21
#include <bits/stdc++.h>
using namespace std;
#define ls(p) (p << 1)
#define rs(p) (p << 1 | 1)
const int N = 5e5 + 5;
namespace sgt
{
    struct va
    {
        int maxx, lmax, rmax;
    };
    struct node
    {
        va val;
        int tag = -1;
    } t[N << 2];
    void pushup(int p, int ln, int rn)
    {
        t[p].val.maxx = max({t[ls(p)].val.maxx, t[rs(p)].val.maxx, t[rs(p)].val.lmax + t[ls(p)].val.rmax});
        t[p].val.lmax = t[ls(p)].val.lmax + (t[ls(p)].val.maxx == rn - ln + 1) * t[rs(p)].val.maxx;
        t[p].val.rmax = t[rs(p)].val.rmax + (t[rs(p)].val.maxx == rn - ln + 1) * t[ls(p)].val.maxx;
    }
    void addtag(int p, int l, int r, int val)
    {
        if (t[p].tag == 1)
            t[p].val = {0, 0, 0};
        else
            t[p].val = {r - l + 1, r - l + 1, r - l + 1};
        t[p].tag = val;
    }
    void pushdown(int p, int l, int r)
    {
        if (t[p].tag == -1)
            return;
        int mid = (l + r) >> 1;
        addtag(ls(p), l, mid, t[p].tag);
        addtag(rs(p), mid + 1, r, t[p].tag);
        // t[ls(p)].tag = t[rs(p)].tag = t[p].tag=-1;
        t[p].tag = -1;
    }
    void build(int p, int l, int r)
    {
        if (l == r)
        {
            t[p].val = {1, 1, 1};
            return;
        }
        int mid = (l + r) >> 1;
        build(ls(p), l, mid);
        build(rs(p), mid + 1, r);
        pushup(p, l, r);
    }
    void update(int p, int l, int r, int L, int R, int val)
    {
        if (L <= l && r <= R)
        {
            addtag(p, l, r, val);
            return;
        }
        pushdown(p, l, r);
        int mid = (l + r) >> 1;
        if (L <= mid)
            update(ls(p), l, mid, L, R, val);
        if (R > mid)
            update(rs(p), mid + 1, r, L, R, val);
        pushup(p, l, r);
    }
    int query(int p, int l, int r, int val)
    {
        pushdown(p, l, r);
        if (l == r)
            return l;
        int mid = (l + r) >> 1;
        if (t[ls(p)].val.maxx >= val)
            return query(ls(p), l, mid, val);
        else if (t[ls(p)].val.rmax + t[rs(p)].val.lmax >= val)
            return mid - t[ls(p)].val.rmax + 1;
        else
            return query(rs(p), mid + 1, r, val);
    }
};
using namespace sgt;
int main()
{
    int n, m, ans = 0;
    cin >> n >> m;
    build(1, 1, n);
    while (m--)
    {
        char op;
        cin >> op;
        if (op == 'A')
        {
            int x;
            cin >> x;
            if (t[1].val.maxx < x)
                ans++;
            else
            {
                int pos = query(1, 1, n, x);
                update(1, 1, n, pos, pos + x - 1, 1);
            }
        }
        else
        {
            int l, r;
            cin >> l >> r;
            update(1, 1, n, l, r, 0);
        }
    }
    cout << ans << endl;
    return 0;
}

样例都过不去

2025/1/25 16:21
加载中...