比赛 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;
}