社区讨论

46分求调

P1607[USACO09FEB] Fair Shuttle G参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mc6a6426
此快照首次捕获于
2025/06/21 21:34
9 个月前
此快照最后确认于
2025/11/04 07:02
4 个月前
查看原帖
为什么只有 4646
CPP
#include<bits/stdc++.h>
using namespace std;
const int N = 8e4+1;
int k, n, c;
struct Node{
    int l, r, m;
    bool operator<(const Node &i) const {return r < i.r;}
};
vector<Node> v;
int mn[N], tag[N];
void pushup(int p){mn[p] = min(mn[p*2], mn[p*2+1]);}
void down(int p, int t){
    tag[p] -= t;
    mn[p] -= t;
}
void update(int p, int l, int r, int s, int t, int k){
    // 区间 减 k
    if (s <= l && r <= t){
        down(p, k);
        return;
    }
    int mid = l + r >> 1;
    down(p*2, tag[p]);
    down(p*2+1, tag[p]);
    tag[p] = 0;
    if (s <= mid) update(p*2, l, mid, s, t, k);
    if (t > mid) update(p*2+1,mid+1,r,s,t,k);
    pushup(p);
}
int query(int p,int l,int r,int s,int t){
    if (s<=l && r<=t) return mn[p];
    int mid = l + r >> 1;
    down(p*2, tag[p]);
    down(p*2+1, tag[p]);
    tag[p] = 0;
    int ans = 1e9;
    if (s<=mid) ans = query(p*2,l,mid,s,t);
    if (t>mid) ans = min(ans,query(p*2+1,mid+1,r,s,t));
    return ans;
}
long long ans;

int main(){
    cin>>k>>n>>c;
    v.resize(k);
    for(int i=0;i<k;i++) cin >> v[i].l >> v[i].r >> v[i].m;
    sort(v.begin(), v.end());
    for(int i=0;i<N;i++) mn[i] = c;
    for(auto [l,r,m]:v){
        int t = query(1,1,n,l,r-1);
        t = min(t, m);
        ans += t;
        update(1,1,n,l,r-1,t);
    }
    cout << ans;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...