제출 #1359469

#제출 시각아이디문제언어결과실행 시간메모리
1359469kantaponzFuel Station (NOI20_fuelstation)C++20
67 / 100
3094 ms14780 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long

const int nx = 3e5 + 5;

struct Data {
    ll x, a, b;
    bool operator< (const Data &o) const {
        return x < o.x;
    }
    Data(int x=0, int a = 0, int b = 0): x(x), a(a), b(b) {}
};

int n; ll d;
vector<Data> v;
vector<int> interval;

bool check(ll f) {
    ll cur = f;
    for (int i = 0; i + 1 < v.size(); i++) {
        ll dist = v[i+1].x - v[i].x;
        cur -= dist;
        if (cur < 0) return false;
        if (f > v[i + 1].b) continue;
        cur += v[i + 1].a;
    }
    return true;
}

int main() {
    ios_base::sync_with_stdio(0), cin.tie(0);
    cin >> n >> d;
    v.emplace_back(0, 0, 0);
    v.emplace_back(d, 0, 0);
    for (int i = 1; i <= n; i++) {
        int x, a, b;
        cin >> x >> a >> b;
        v.emplace_back(x, a, b);
        interval.push_back(b);
    }
    sort(v.begin(), v.end());
    interval.push_back(-1);
    interval.push_back(d);
    sort(interval.begin(), interval.end());
    interval.erase(unique(interval.begin(), interval.end()), interval.end());
    ll ans = 1e9 + 1;
    for (int i = 0; i + 1 < interval.size(); i++) {
        ll l = interval[i]+1, r = interval[i + 1];
        if (l > r) continue;
        while (l < r) {
            int mid = (l + r) / 2;
            if (check(mid)) r = mid;
            else l = mid + 1;
        }

        if (check(l)) ans = min(ans, l);
    }

    cout << ans;

}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…