1 条题解

  • 0
    @ 2025-6-21 11:27:53

    使用封装了的线段树完成的例子

    #include <bits/stdc++.h>
    #define int long long
    using namespace std;
    const int MAXN = 200000 + 5;
    int D;
    struct SegTree
    {
        int sum[MAXN * 4], maxx[MAXN * 4];
        void build(int o, int l, int r)
        {
            if (l == r)
            {
                sum[o] = maxx[o] = 0;
                return;
            }
            int mid = (l + r) >> 1;
            build(o * 2, l, mid);
            build(o * 2 + 1, mid + 1, r);
            sum[o] = sum[o * 2] + sum[o * 2 + 1];
            maxx[o] = max(maxx[o * 2], maxx[o * 2 + 1]);
        }
        int query_max(int o, int l, int r, int ql, int qr)
        {
            if (l > qr || r < ql)
                return -1;
            if (ql <= l && r <= qr)
                return maxx[o];
            int mid = (l + r) >> 1;
            return max(query_max(o * 2, l, mid, ql, qr), query_max(o * 2 + 1, mid + 1, r, ql, qr));
        }
        int query_sum(int o, int l, int r, int ql, int qr)
        {
            if (l > qr || r < ql)
                return 0;
            if (ql <= l && r <= qr)
                return sum[o];
            int mid = (l + r) >> 1;
            return query_sum(o * 2, l, mid, ql, qr) + query_sum(o * 2 + 1, mid + 1, r, ql, qr);
        }
        void update(int o, int l, int r, int x, int t)
        {
            if (l == r)
            {
                maxx[o] = sum[o] = t;
                return;
            }
            int mid = (l + r) >> 1;
            if (x <= mid)
                update(o * 2, l, mid, x, t); // 左右分别更新
            else
                update(o * 2 + 1, mid + 1, r, x, t);
            sum[o] = sum[o * 2] + sum[o * 2 + 1];
            maxx[o] = max(maxx[o * 2], maxx[o * 2 + 1]);
        }
    } st;
    int m, cnt, t, n;
    int a[MAXN];
    signed main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> m >> D;
        n = m;
        st.build(1, 1, n);
        cnt = t = 0;
        while (m--)
        {
            char op;
            int x;
            cin >> op >> x;
            if (op == 'A')
            {
                cnt++;
                st.update(1, 1, n, cnt, (t + x) % D);
            }
            else if (op == 'Q')
            {
                t = st.query_max(1, 1, n, cnt - x + 1, cnt);
                cout << t << "\n";
            }
        }
        return 0;
    }
    
    • 1

    信息

    ID
    2015
    时间
    1000ms
    内存
    128MiB
    难度
    4
    标签
    递交数
    26
    已通过
    10
    上传者