比赛 |
20250904开学热身赛 |
评测结果 |
AAAAA |
题目名称 |
内存分配 |
最终得分 |
100 |
用户昵称 |
健康铀 |
运行时间 |
0.085 s |
代码语言 |
C++ |
内存使用 |
3.88 MiB |
提交时间 |
2025-09-04 21:59:12 |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct Pro {
ll T, M, P;
};
struct Ev {
ll t;
int s, l;
Ev(ll _t, int _s, int _l) : t(_t), s(_s), l(_l) {}
};
struct CmpEv {
bool operator()(const Ev& a, const Ev& b) {
return a.t > b.t;
}
};
list<pair<int, int>> fre;
priority_queue<Ev, vector<Ev>, CmpEv> evq;
queue<Pro> wq;
ll now;
int cnt = 0;
void fre_mem(int s, int l) {
auto it = fre.begin();
while (it != fre.end() && it->first < s) {
it++;
}
it = fre.insert(it, {s, l});
if (it != fre.begin()) {
auto pv = it;
pv--;
if (pv->first + pv->second == it->first) {
pv->second += it->second;
fre.erase(it);
it = pv;
}
}
if (it != fre.end()) {
auto nx = it;
nx++;
if (nx != fre.end() && it->first + it->second == nx->first) {
it->second += nx->second;
fre.erase(nx);
}
}
}
int main() {
freopen("memory.in","r",stdin);
freopen("memory.out","w",stdout);
int N;
cin >> N;
fre.push_back({0, N});
vector<Pro> ps;
ll t, m, p;
while (cin >> t >> m >> p) {
if (t == 0 && m == 0 && p == 0) break;
ps.push_back({t, m, p});
}
int i = 0;
int n = ps.size();
now = 0;
while (i < n || !evq.empty() || !wq.empty()) {
if (!evq.empty() && (i == n || evq.top().t <= ps[i].T)) {
now = evq.top().t;
while (!evq.empty() && evq.top().t == now) {
Ev e = evq.top();
evq.pop();
fre_mem(e.s, e.l);
}
while (!wq.empty()) {
Pro p = wq.front();
bool fnd = false;
int st = -1;
auto it = fre.begin();
for (; it != fre.end(); it++) {
if (it->second >= p.M) {
fnd = true;
st = it->first;
break;
}
}
if (!fnd) break;
wq.pop();
evq.push(Ev(now + p.P, st, p.M));
it->first += p.M;
it->second -= p.M;
if (it->second == 0) {
fre.erase(it);
}
}
} else {
now = ps[i].T;
Pro p = ps[i];
i++;
bool fnd = false;
int st = -1;
auto it = fre.begin();
for (; it != fre.end(); it++) {
if (it->second >= p.M) {
fnd = true;
st = it->first;
break;
}
}
if (fnd) {
evq.push(Ev(now + p.P, st, p.M));
it->first += p.M;
it->second -= p.M;
if (it->second == 0) {
fre.erase(it);
}
} else {
wq.push(p);
cnt++;
}
}
}
cout << now << endl;
cout << cnt << endl;
return 0;
}