제출 #1338373

#제출 시각아이디문제언어결과실행 시간메모리
1338373alexddBitaro the Brave 3 (JOI25_brave3)C++20
1 / 100
2095 ms472 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 6005;
int n,maxL,T;
int s[MAXN], h[MAXN], p[MAXN], ramas[MAXN];



vector<pair<pair<int,int>,int>> timeline;
int calc(int L)
{
    vector<int> ord;
    for(int i=1;i<=n;i++)
        ord.push_back(i);
    sort(ord.begin(), ord.end(), [&](int x, int y)
    {
        if(s[x] != s[y])
            return s[x] < s[y];
        return p[x] > p[y];
    });

    for(int i=1;i<=n;i++)
        ramas[i] = h[i] * L;

    priority_queue<pair<int,int>> pq;
    int curt = 0;

    s[n+1] = T;
    ord.push_back(n+1);

    timeline.clear();
    for(int id:ord)
    {
        //cerr<<id<<": "<<s[id]<<" "<<h[id]*L<<" "<<p[id]<<"\n";

        while(!pq.empty() && curt + ramas[pq.top().second] <= s[id])
        {
            timeline.push_back({{curt, curt + ramas[pq.top().second]}, pq.top().second});
            curt += ramas[pq.top().second];
            ramas[pq.top().second] = 0;
            pq.pop();
        }
        if(!pq.empty())
        {
            assert(curt + ramas[pq.top().second] > s[id]);

            timeline.push_back({{curt, s[id]}, pq.top().second});
            ramas[pq.top().second] -= s[id] - curt;
            curt = s[id];
        }
        curt = s[id];

        pq.push({p[id], id});
    }

    vector<pair<pair<int,int>,int>> newt;
    if(!timeline.empty())
    {
        newt.push_back(timeline[0]);
        for(int i=1;i<timeline.size();i++)
        {
            if(newt.back().second == timeline[i].second)
            {
                assert(newt.back().first.second == timeline[i].first.first);
                newt.back().first.second = timeline[i].first.second;
            }
            else
            {
                newt.push_back(timeline[i]);
            }
        }
    }
    timeline = newt;

    int rez = 0;
    for(int i=1;i<=n;i++)
        rez += ramas[i] * p[i];

    //cerr<<L<<" "<<rez<<" cost\n\n";
    return rez;
}

vector<pair<pair<int,int>,int>> oldt, newt;

signed main()
{
    ios_base::sync_with_stdio(0);cin.tie(0);
    cin>>n>>maxL>>T;
    for(int i=1;i<=n;i++)
    {
        cin>>s[i]>>h[i]>>p[i];
    }

    int curL = 0, curcost = -1, curdif = 0, first_bad = 1;

    int q;
    cin>>q;
    while(q--)
    {
        int m;
        cin>>m;
        while(curL+1 <= maxL+1 && curcost <= m)
        {
            curL++;
            if(curL == first_bad)
            {
                curcost = calc(curL);
                oldt = timeline;

                curdif = calc(curL + 1) - curcost;
                newt = timeline;

                /*first_bad = maxL + 3;

                first_bad += curL;*/
                first_bad = curL + 1;
            }
            else
                curcost += curdif;
        }
        cout<<curL-1<<"\n";
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...