线段树WA 第六个点
查看原帖
线段树WA 第六个点
363383
bili_nullptr楼主2024/10/24 22:26

如题 求调

#include <cstring>
#include <iostream>

using namespace std;

const int N = 1e5 + 10;
struct SegmentTree {
#define mid ((l + r) >> 1)
#define ls p << 1, l, mid
#define rs p << 1 | 1, mid + 1, r
    int n;
    int cnt[26][N << 2];
    int lazy[N << 2];
    SegmentTree() {
        memset(cnt, 0, sizeof(cnt));
        memset(lazy, -1, sizeof(lazy));
    }
    inline void pushup(int p) {
        for (int i = 0; i < 26; ++i) {
            cnt[i][p] = cnt[i][p << 1] + cnt[i][p << 1 | 1];
        }
    }
    inline void build(int p, int l, int r, char s[]) {
        if (l == r) {
            cnt[s[l] - 'a'][p] = 1;
            return;
        }
        build(ls, s);
        build(rs, s);
        pushup(p);
    }
    inline void pushdown(int p, int l, int r) {
        if (lazy[p] == -1)
            return;
        for (int i = 0; i < 26; ++i) {
            cnt[i][p << 1] = 0;
            cnt[i][p << 1 | 1] = 0;
        }
        cnt[lazy[p]][p << 1] = (l - mid + 1);
        cnt[lazy[p]][p << 1 | 1] = r - mid;
        lazy[p << 1] = lazy[p << 1 | 1] = lazy[p];
        lazy[p] = -1;
    }
    inline void modify(int p, int l, int r, int L, int R, int x) {
        if (l > R || r < L)
            return;
        if (L <= l && r <= R) {
            for (int i = 0; i < 26; ++i) {
                cnt[i][p] = 0;
            }
            cnt[x][p] = (r - l + 1);
            lazy[p] = x;
            return;
        }
        pushdown(p, l, r);
        modify(ls, L, R, x);
        modify(rs, L, R, x);
        pushup(p);
    }

    inline void query(int p, int l, int r, int L, int R, int t[]) {
        if (l > R || r < L)
            return;
        if (L <= l && r <= R) {
            for (int i = 0; i < 26; ++i) {
                t[i] += cnt[i][p];
            }
            return;
        }
        pushdown(p, l, r);
        query(ls, L, R, t);
        query(rs, L, R, t);
    }

    inline void prt(int p, int l, int r, char s[]) {
        if (l == r) {
            for (int i = 0; i < 26; ++i) {
                if (cnt[i][p]) {
                    s[l] = i + 'a';
                    return;
                }
            }
        }
        pushdown(p, l, r);
        prt(ls, s);
        prt(rs, s);
    }
    inline void build(int n_, char ch[]) { n = n_, build(1, 1, n, ch); }
    inline void query(int l, int r, int t[]) { query(1, 1, n, l, r, t); }
    inline void modify(int l, int r, int x) {
        l <= r ? modify(1, 1, n, l, r, x) : void();
    }
    inline void prt(char s[]) { prt(1, 1, n, s); }
};
char s[N];

SegmentTree sgt;
int main() {
    int n, m;
    cin >> n >> m;
    cin >> (s + 1);
    sgt.build(n, s);
    int t[26];
    while (m--) {
        int l, r, op;
        cin >> l >> r >> op;
        memset(t, 0, sizeof(t));
        sgt.query(l, r, t);
        int cur = l;
        if (op == 1) {
            for (int i = 0; i < 26; ++i) {
                sgt.modify(cur, cur + t[i] - 1, i);
                cur += t[i];
            }
        } else {
            for (int i = 25; i >= 0; --i) {
                sgt.modify(cur, cur + t[i] - 1, i);
                cur += t[i];
            }
        }
    }
    sgt.prt(s);
    cout << (s + 1) << "\n";
    return 0;
}
2024/10/24 22:26
加载中...