A171746题解
2026-10-12 21:12:04
发布于:浙江
1阅读
0回复
0点赞
嗯对,非常简单
直接上代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int p, q;
if (!(cin >> p >> q)){
return 0;
}
vector<long long> s(p + 1);
for (int j = 1; j <= p; j++) cin >> s[j];
struct Order {
int pages = 0;
int status = 0;
long long finish_time = -1;
};
vector<Order> orders(1);
queue<int> waitq;
vector<long long> finish_time(p + 1, LLONG_MAX);
vector<bool> paused(p + 1, false);
vector<int> current_order(p + 1, 0);
auto cmp = [](const pair<long long,int>& a, const pair<long long,int>& b) {
if (a.first != b.first) return a.first > b.first;
return a.second > b.second;
};
priority_queue<pair<long long,int>, vector<pair<long long,int>>, decltype(cmp)> pq(cmp);
auto distribute = [&](long long now) {
while (!waitq.empty()) {
while (!waitq.empty() && orders[waitq.front()].status == 3) {
waitq.pop();
}
if (waitq.empty()) break;
int chosen = -1;
for (int j = 1; j <= p; j++) {
if (finish_time[j] == LLONG_MAX && !paused[j]) {
chosen = j;
break;
}
}
if (chosen == -1) break;
int oid = waitq.front();
waitq.pop();
orders[oid].status = 1;
long long ft = now + (long long)orders[oid].pages * s[chosen];
finish_time[chosen] = ft;
current_order[chosen] = oid;
pq.push({ft, chosen});
}
};
auto settle_printer = [&](int j) {
int oid = current_order[j];
if (oid > 0 && orders[oid].status == 1) {
orders[oid].status = 2;
orders[oid].finish_time = finish_time[j];
}
finish_time[j] = LLONG_MAX;
current_order[j] = 0;
};
struct Query { long long t; int op, x; };
vector<Query> queries(q);
for (int i = 0; i < q; i++) {
cin >> queries[i].t >> queries[i].op >> queries[i].x;
}
int idx = 0;
while (idx < q) {
long long t = queries[idx].t;
while (!pq.empty() && pq.top().first < t) {
auto [ft, j] = pq.top(); pq.pop();
if (ft != finish_time[j]) continue;
settle_printer(j);
distribute(finish_time[j] == LLONG_MAX ? ft : ft);
}
while (idx < q && queries[idx].t == t) {
int op = queries[idx].op, x = queries[idx].x;
if (op == 1) {
int oid = (int)orders.size();
orders.push_back({x, 0, -1});
waitq.push(oid);
} else if (op == 2) {
if (orders[x].status == 0) {
orders[x].status = 3;
}
} else if (op == 3) {
paused[x] = true;
} else if (op == 4) {
paused[x] = false;
}
idx++;
}
while (!pq.empty() && pq.top().first == t) {
auto [ft, j] = pq.top(); pq.pop();
if (ft != finish_time[j]) continue;
settle_printer(j);
}
distribute(t);
}
while (!pq.empty()) {
auto [ft, j] = pq.top(); pq.pop();
if (ft != finish_time[j]) continue;
settle_printer(j);
distribute(ft);
}
int n = (int)orders.size() - 1;
for (int oid = 1; oid <= n; oid++) {
if (orders[oid].status == 2) {
cout << orders[oid].finish_time << "\n";
} else if (orders[oid].status == 3) {
cout << -1 << "\n";
} else {
cout << -2 << "\n";
}
}
}
这里空空如也







有帮助,赞一个