92分求助 , 不知道错哪, 马峰绝对清晰
查看原帖
92分求助 , 不知道错哪, 马峰绝对清晰
689146
mushezi楼主2024/2/26 22:30

谢谢

#include <bits/stdc++.h>
using namespace std;

const int N = 5e4 + 5;

struct SGT{
    #define lc u<<1
    #define rc u<<1|1

    struct Node{
        int l, r, lres, rres, res, lazy;

        void tag(int x){
            if(x == 1){
                lres = rres = res = 0;
                lazy = 1;
            }
            else{
                lres = rres = res = r - l + 1;
                lazy = 2;
            }
        }
    } t[N << 2];

    void Up(Node & t, Node & ls, Node & rs){
        t.lres = ls.lres;
        t.rres = rs.rres;
        if(ls.res == ls.r - ls.l + 1) t.lres = ls.res + rs.lres;
        if(rs.res == rs.r - rs.l + 1) t.rres = ls.rres + rs.res;
        t.res = max({ls.res, rs.res, ls.rres + rs.lres});
    }   

    void Up(int u){
        Up(t[u], t[lc], t[rc]);
    }

    void Dn(int u){
        if(!t[u].lazy) return ;
        t[lc].tag(t[u].lazy);
        t[rc].tag(t[u].lazy);
        t[u].lazy = 0; 
    }

    void Build(int u, int l, int r){
        t[u].l = l, t[u].r = r;
        t[u].lres = t[u].rres = t[u].res = r - l + 1;
        if(l == r) return ;

        int mid = (l + r) >> 1;
        Build(lc, l, mid);
        Build(rc, mid + 1, r);
    }

    void Modify(int u, int L, int R, int type){
        if(L <= t[u].l && t[u].r <= R){
            t[u].tag(type);
            return ;
        }
        Dn(u);
        int mid = (t[u].l + t[u].r) >> 1;
        if(L <= mid) Modify(lc, L, R, type);
        if(R > mid) Modify(rc, L, R, type);
        Up(u);
    }

    int Query(int u, int len){
        if(t[u].res < len) return 0;

        if(t[lc].res >= len) return Query(lc, len);
        if(t[lc].rres + t[rc].lres >= len) return (t[lc].r - t[lc].rres + 1);
        return Query(rc, len);
    }
} sgt;

int n, m, i, x, y;

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> n >> m;
    sgt.Build(1, 1, n);

    while(m--){
        cin >> i >> x;
        if(i == 1){
            int res = sgt.Query(1, x);
            if(res) sgt.Modify(1, res, res + x - 1, 1);
            cout << res << '\n';
        }
        else{
            cin >> y;
            sgt.Modify(1, x, x + y - 1, 2);
        }
    }

    return 0;
}
2024/2/26 22:30
加载中...