1 条题解

  • 0
    @ 2025-10-8 17:04:20

    C32 线段树+贪心 P1607 [USACO09FEB] Fair Shuttle G

    // 贪心+线段树 O(nlogn)
    #include <bits/stdc++.h>
    using namespace std;
    #define ls p << 1
    #define rs p << 1 | 1
    #define mid (tr[p].l + tr[p].r) / 2
    const int N = 5e4 + 10;
    int n, k, c, ans;
    struct line
    {
        int l, r, m;
        bool operator<(line &b) { return r < b.r; }
    } s[N]; // 区间
    struct trnode{int l, r, mx, lazy;} tr[N << 2];
    void pushup(int p) { tr[p].mx = max(tr[ls].mx, tr[rs].mx); }
    void pushdown(int p)
    {
        if (tr[p].lazy)
        {
            tr[ls].mx += tr[p].lazy;
            tr[rs].mx += tr[p].lazy;
            tr[ls].lazy += tr[p].lazy;
            tr[rs].lazy += tr[p].lazy;
            tr[p].lazy = 0;
        }
    }
    void build(int p, int l, int r)
    { // 建树
        tr[p] = trnode{l, r, 0, 0};
        if (l == r)return;
        build(ls, l, mid);
        build(rs, mid + 1, r);
        pushup(p);
    }
    void change(int p, int l, int r, int v)
    {
    
        if (l <= tr[p].l && tr[p].r <= r)
        {
            tr[p].mx += v;
            tr[p].lazy += v;
            return;
        }
        pushdown(p);
        if(l <= mid)change(ls, l, r, v);
        if(r > mid)change(rs, l, r, v);
        pushup(p);
    }
    int query(int p, int l, int r)
    {
        if (l <= tr[p].l && tr[p].r <= r)return tr[p].mx;
        pushdown(p);
        int res=0;
        if(l <= mid) res=max(res, query(ls, l, r));
        if(r > mid) res=max(res, query(rs, l, r));
        return res;
    }
    int main()
    {
        scanf("%d%d%d", &k, &n, &c);
        for (int i = 1; i <= k; i++)scanf("%d%d%d", &s[i].l, &s[i].r, &s[i].m);
        sort(s + 1, s + k + 1); // 按右端排序
        build(1, 1, n);
        for (int i = 1; i <= k; i++)
        {
            int l = s[i].l, r = s[i].r, m = s[i].m;
            int mx = query(1, l, r - 1);
            int x = min(c - mx, m); // 能上车的牛数
            change(1, l, r - 1, x);
            ans += x;
        }
        printf("%d\n", ans);
        return 0;
    }
    
    • 1

    C32【线段树+贪心 】[USACO09FEB] Fair Shuttle G

    信息

    ID
    3232
    时间
    1000ms
    内存
    128MiB
    难度
    6
    标签
    递交数
    61
    已通过
    18
    上传者