Submission #1369548

#TimeUsernameProblemLanguageResultExecution timeMemory
1369548Charizard2021Jobs (BOI24_jobs)C++20
29 / 100
140 ms29484 KiB
#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    long long s;
    cin >> n >> s;
    vector<long long> x(n + 1);
    vector<int> p(n + 1);
    vector<vector<long long> > chains;
    for(int i = 1; i <= n; i++){
        cin >> x[i] >> p[i];
        if(p[i] == 0){
            chains.push_back(vector<long long>());
            chains.back().push_back(x[i]);
        }
        else{
            chains.back().push_back(x[i]);
        }
    }
    vector<vector<pair<long long, long long> > > segs(chains.size());
    for(int c = 0; c < (int)chains.size(); c++){
        int m = chains[c].size();
        int i = 0;
        while(i < m){
            long long sum = 0;
            long long mn = 0;
            bool done = false;
            for(int j = i; j < m; j++){
                sum += chains[c][j];
                mn = min(mn, sum);
                if(sum > 0){
                    long long need = -mn;
                    long long gain = sum;
                    segs[c].push_back({need, gain});
                    i = j + 1;
                    done = true;
                    break;
                }
            }
            if(!done){
                break;
            }
        }
    }
    priority_queue<tuple<long long, long long, int, int>, vector<tuple<long long, long long, int, int> >, greater<tuple<long long, long long, int, int> > > pq;
    for(int c = 0; c < (int)segs.size(); c++){
        if(!segs[c].empty()){
            long long need = segs[c][0].first;
            long long gain = segs[c][0].second;
            pq.push({need, gain, c, 0});
        }
    }
    long long res = s;
    while(!pq.empty()){
        auto [need, gain, c, idx] = pq.top();
        if(need > res){
            break;
        }
        pq.pop();
        res += gain;
        int nxt = idx + 1;
        if(nxt < (int)segs[c].size()){
            long long nneed = segs[c][nxt].first;
            long long ngain = segs[c][nxt].second;
            pq.push({nneed, ngain, c, nxt});
        }
    }
    cout << res - s << "\n";
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...