1 条题解

  • 0
    @ 2026-11-2 13:11:11

    干草堆计数(Counting Haybale P) 题解

    思路分析

    按题目要求使用对应数据结构与算法模拟/递推求解,注意数据范围边界与时间复杂度。

    参考代码

    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    const long long INF = (1LL << 60);
    int n, q;
    vector<long long> a, sumT, minT, tag;
    
    void pull(int u) {
        sumT[u] = sumT[u << 1] + sumT[u << 1 | 1];
        minT[u] = min(minT[u << 1], minT[u << 1 | 1]);
    }
    
    void apply(int u, int l, int r, long long v) {
        sumT[u] += v * (r - l + 1);
        minT[u] += v;
        tag[u] += v;
    }
    
    void push(int u, int l, int r) {
        if (tag[u] != 0) {
            int mid = (l + r) >> 1;
            apply(u << 1, l, mid, tag[u]);
            apply(u << 1 | 1, mid + 1, r, tag[u]);
            tag[u] = 0;
        }
    }
    
    void build(int u, int l, int r) {
        if (l == r) {
            sumT[u] = minT[u] = a[l];
            return;
        }
        int mid = (l + r) >> 1;
        build(u << 1, l, mid);
        build(u << 1 | 1, mid + 1, r);
        pull(u);
    }
    
    void update(int u, int l, int r, int ql, int qr, long long v) {
        if (ql <= l && r <= qr) {
            apply(u, l, r, v);
            return;
        }
        push(u, l, r);
        int mid = (l + r) >> 1;
        if (ql <= mid) update(u << 1, l, mid, ql, qr, v);
        if (qr > mid) update(u << 1 | 1, mid + 1, r, ql, qr, v);
        pull(u);
    }
    
    long long queryMin(int u, int l, int r, int ql, int qr) {
        if (ql <= l && r <= qr) return minT[u];
        push(u, l, r);
        int mid = (l + r) >> 1;
        long long res = INF;
        if (ql <= mid) res = min(res, queryMin(u << 1, l, mid, ql, qr));
        if (qr > mid) res = min(res, queryMin(u << 1 | 1, mid + 1, r, ql, qr));
        return res;
    }
    
    long long querySum(int u, int l, int r, int ql, int qr) {
        if (ql <= l && r <= qr) return sumT[u];
        push(u, l, r);
        int mid = (l + r) >> 1;
        long long res = 0;
        if (ql <= mid) res += querySum(u << 1, l, mid, ql, qr);
        if (qr > mid) res += querySum(u << 1 | 1, mid + 1, r, ql, qr);
        return res;
    }
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        if (!(cin >> n >> q)) return 0;
        a = vector<long long>(n + 1, 0);
        for (int i = 1; i <= n; ++i) cin >> a[i];
        sumT.assign(4 * n + 5, 0);
        minT.assign(4 * n + 5, INF);
        tag.assign(4 * n + 5, 0);
        build(1, 1, n);
        for (int i = 0; i < q; ++i) {
            char op;
            int l, r;
            cin >> op >> l >> r;
            if (op == 'P') {
                long long c;
                cin >> c;
                update(1, 1, n, l, r, c);
            } else if (op == 'M') {
                cout << queryMin(1, 1, n, l, r) << "\n";
            } else {
                cout << querySum(1, 1, n, l, r) << "\n";
            }
        }
        return 0;
    }
    
    • 1

    信息

    ID
    8654
    时间
    1000ms
    内存
    256MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者