1 条题解

  • 0
    @ 2024-10-9 15:38:59

    线段树

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N = 1e6 + 10, INF = 0x3f3f3f3f, MOD = 1E9 + 7;
    int n, m;
    struct Node {
        int l, r, x, lazy;  // x represents the number of lights on.
    } tr[N << 2];
    
    void pushup(Node& u, Node& l, Node& r) {
        u.x = l.x + r.x;
    }
    void pushup(int u) {
        pushup(tr[u], tr[u << 1], tr[u << 1 | 1]);
    }
    void pushdown(int u) {
        if (tr[u].lazy) {
            tr[u << 1].x = tr[u << 1].r - tr[u << 1].l + 1 - tr[u << 1].x;
            tr[u << 1].lazy = !tr[u << 1].lazy;
            tr[u << 1 | 1].x = tr[u << 1 | 1].r - tr[u << 1 | 1].l + 1 - tr[u << 1 | 1].x;
            tr[u << 1 | 1].lazy = !tr[u << 1 | 1].lazy;
            tr[u].lazy = 0;
        }
    }
    void build(int u, int l, int r) {
        tr[u] = {l, r, 0, 0};
        if (l == r) return;
        int mid = l + r >> 1;
        build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
        pushup(u);
    }
    void modify(int u, int l, int r) {
        if (l <= tr[u].l && r >= tr[u].r) {
            tr[u].x = tr[u].r - tr[u].l + 1 - tr[u].x;
            tr[u].lazy = !tr[u].lazy;
            return;
        }
        pushdown(u);
        int mid = tr[u].l + tr[u].r >> 1;
        if (l <= mid) modify(u << 1, l, r);
        if (r > mid) modify(u << 1 | 1, l, r);
        pushup(u);
    }
    Node query(int u, int l, int r) {
        if (l <= tr[u].l && r >= tr[u].r) return tr[u];
        pushdown(u);
        int mid = tr[u].l + tr[u].r >> 1;
        Node res, left = {0, 0, 0}, right = {0, 0, 0};
        if (l <= mid) left = query(u << 1, l, r);
        if (r > mid) right = query(u << 1 | 1, l, r);
        pushup(res, left, right);
        return res;
    }
    int main(int argc, char* argv[]) {
        scanf("%d%d", &n, &m), build(1, 1, n);
        int op, l, r;
        while (m--) {
            scanf("%d%d%d", &op, &l, &r);
            if (op == 0) modify(1, l, r);
            else printf("%d\n", query(1, l, r).x);
        }
        return 0;
    }
    
    • 1

    信息

    ID
    1688
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    3
    已通过
    1
    上传者