求卡空间
查看原帖
求卡空间
730195
Little_Cabbage楼主2024/11/23 14:12

开了 3030 个线段树,MLE了。

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

const int N = 1e5 + 5;

int n, t, o;

struct SEGMENTTREE {
    struct SegmentTree {
        int l, r;
        int add;
        int lazy_add = -1;
    } tr[N << 2];

    void up(int k) {
        tr[k].add = tr[k << 1].add + tr[k << 1 | 1].add;
    }

    void down(int k) {
        if (tr[k].lazy_add == -1) return ;
        int ls = k << 1, rs = k << 1 | 1;
        tr[ls].lazy_add = tr[k].lazy_add;
        tr[rs].lazy_add = tr[k].lazy_add;
        tr[ls].add = tr[k].lazy_add;
        tr[rs].add = tr[k].lazy_add;
        tr[k].lazy_add = -1;
    }

    void Build(int k, int l, int r) {
        tr[k].l = l, tr[k].r = r;
        if (l == r) {
            tr[k].add = 0;
            return ;
        }
        int mid = l + r >> 1;
        Build(k << 1, l, mid);
        Build(k << 1 | 1, mid + 1, r);
        up(k);
    }

    void Updata(int k, int l, int r, int val) {
        if (tr[k].l > r || tr[k].r < l) return ;
        if (l <= tr[k].l && tr[k].r <= r) {
            tr[k].add = val;
            tr[k].lazy_add = val;
            return ;
        }
        down(k);
        Updata(k << 1, l, r, val);
        Updata(k << 1 | 1, l, r, val);
        up(k);
    }

    int Query(int k, int l, int r) {
        if (tr[k].l > r || tr[k].r < l) return 0;
        if (l <= tr[k].l && tr[k].r <= r) return tr[k].add;
        down(k);
        return Query(k << 1, l, r) + Query(k << 1 | 1, l, r);
    }
} tree[31];

signed main() {
    cin >> n >> t >> o;
    for (int i = 1; i <= t; i ++ ) tree[i].Build(1, 1, n);
    tree[1].Updata(1, 1, n, 1);
    while (o -- ) {
        char ch;
        int l, r, k;
        cin >> ch >> l >> r;
        if (l > r) swap(l, r);
        if (ch == 'C') {
            cin >> k;
            for (int i = 1; i <= t; i ++ ) {
                if (i == k) tree[i].Updata(1, l, r, 1);
                else tree[i].Updata(1, l, r, 0);
            }
        } else {
            int res = 0;
            for (int i = 1; i <= t; i ++ ) {
                int t = tree[i].Query(1, l, r);
                if (t) res ++ ;
            }
            cout << res << endl;
        }
        // for (int i = 1; i <= t; i ++ ) {
        //     for (int j = 1; j <= n; j ++ )
        //         cout << tree[i].Query(1, j, j) << " ";
        //     cout << endl;
        // }
        // cout << endl;
    }
    return 0;
}
2024/11/23 14:12
加载中...