← 返回题目页

T0595 算法六(末B)

标程

#include <bits/stdc++.h>
using namespace std;

using ll = long long;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m;
    cin >> n >> m;

    // cap[i]:第 i 个小组当前的剩余运力
    vector<ll> cap(n + 1);
    for (int i = 1; i <= n; i++) cin >> cap[i];

    // 每个小组一个小根堆,存 (归还时刻, 占用运力)
    vector<priority_queue<pair<ll, ll>, vector<pair<ll, ll>>, greater<pair<ll, ll>>>> busy(n + 1);

    for (int i = 0; i < m; i++) {
        ll st, t, d;
        int id;
        cin >> st >> id >> t >> d;

        // 开工前,先把已经做完的任务占用的运力还回来
        auto &q = busy[id];
        while (!q.empty() && q.top().first <= st) {
            cap[id] += q.top().second;
            q.pop();
        }

        if (cap[id] < d) {
            // 运力不足,取消这次任务
            cout << -1 << "\n";
        } else {
            cap[id] -= d;
            q.push({st + t, d});
            cout << cap[id] << "\n";
        }
    }

    return 0;
}

动画演示