Submission #1353137

#TimeUsernameProblemLanguageResultExecution timeMemory
1353137hyyhFuel Station (NOI20_fuelstation)C++20
79 / 100
3094 ms784356 KiB
#include <iostream>
#include <math.h>
#include <vector>
#include <string>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <iomanip>
#include <set>
#include <bitset>
#include <unordered_map>

#define int long long

using namespace std;
using ll = long long;
using pii = pair<int,int>;
using piii = tuple<int,int,int>;
#define f first
#define s second
#define endl '\n'
#define all(x) begin(x),end(x)

int const caseN = 1e4+10;

signed main(){
    ios_base::sync_with_stdio(0);cin.tie(0);
    int n;cin >> n;
    int d;cin >> d;
    if(d < caseN){
        vector<vector<int>> pref(d+1,vector<int>(d+1,0));
        for(int i{};i < n;i++){
            int a,b,c;cin >> a >> b >> c;
            c = min(c,d);
            pref[a][c] += b;
        }
        for(int i{1};i <= d;i++){
            for(int j{d-1};j >= 0;j--){
                pref[i][j] += pref[i][j+1];
                //cout << pref[i][j] << " ";
            }
            //cout << endl;
        }
        for(int i{1};i <= d;i++){
            int cur = i;
            bool exit = 0;
            for(int j{1};j <= d;j++){
                cur--;
                if(cur < 0){
                    exit = 1;
                    break;
                }
                cur += pref[j][i];
            }
            if(!exit){
                cout << i << endl;
                return 0;
            } 
        }
    }
    else{
        vector<piii> vc;
        vector<int> checking;
        for(int i{};i < n;i++){
            int a,b,c;cin >> a >> b >> c;
            vc.emplace_back(a,b,c);
            checking.emplace_back(c);
        }
        vc.emplace_back(d,0,0);
        sort(all(vc));
        sort(all(checking));
        checking.erase(unique(all(checking)),checking.end());
        int ans = d;
        int si = checking.size();
        for(int i{};i < si;i++){
            int F = checking[i];
            int cur = 0;
            int val = 0;
            int last = 0;
            for(auto [a,b,c]:vc){
                cur -= a-last;
                val = max(val,-cur);
                if(c >= F) cur += b;
                last = a;
            }
            if(val <= F){
                ans = min(ans,val);
            }
            //cout << F << " " << val << endl;
        }
        cout << ans;
    }
}
#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...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...