제출 #1176330

#제출 시각아이디문제언어결과실행 시간메모리
1176330nguyenkhangninh99Fuel Station (NOI20_fuelstation)C++17
13 / 100
238 ms34436 KiB

#include<bits/stdc++.h>
using namespace std;

#define int long long

const int maxn = 3e5 + 5;

struct ttt{
    int x, a, b;
} tram[maxn];

bool cmp(ttt c1, ttt c2){
    return c1.x < c2.x;
}

int st[4 * maxn], lazy[4 * maxn];

void fix(int id, int l, int r){
    if (!lazy[id]) return;
    st[id] += lazy[id];
    lazy[id*2] += lazy[id];
    lazy[id*2+1] += lazy[id];
    lazy[id] = 0;
}
 
void update(int id, int l, int r, int u, int v, int val){
    fix(id, l, r);
    if (v < l || r < u) return;
    if (u <= l && r <= v){
        lazy[id] += val;
        fix(id, l, r);
    }else{
        int mid = l+r>>1;
        update(id*2, l, mid, u, v, val);
        update(id*2+1, mid+1, r, u, v, val);
        st[id] = min(st[id*2], st[id*2+1]);
    }
}
 
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    int n, d; cin >> n >> d;

    vector<int> v, ans(n + 1);
    map<int, vector<int>> mp;

    for(int i = 1; i <= n; i++){
        cin >> tram[i].x >> tram[i].a >> tram[i].b;
        v.push_back(tram[i].b);
    }
    
    sort(tram + 1, tram + n + 1, cmp);
    sort(v.begin(), v.end());
    v.erase(unique(v.begin(), v.end()), v.end());

    for(int i = 1; i <= n; i++){
        mp[tram[i].b].push_back(i);
        update(1, 1, n, i, i, v[0] - tram[i].x);
        int l = i + 1, r = n;
        while(l <= r){
            int mid = (l + r) / 2;
            if(tram[mid].x > tram[i].x){
                ans[i] = mid;
                r = mid - 1;
            }
            else l = mid + 1;
        }

        if(ans[i] > 0) update(1, 1, n, ans[i], n, tram[i].a);
    }

    int kq = 1e15, z = st[1];
    if(z >= 0) kq = min(kq, v[0] - z);
    for(int i = 1; i < v.size(); i++){
        update(1, 1, n, 1, n, v[i] - v[i - 1]);
        for(int y: mp[v[i - 1]]){
            if(ans[y] > 0) update(1, 1, n, ans[y], n, -tram[y].a);
        }
        z = st[1];
        if(z >= 0) kq = min(kq, v[i] - z);
    }
    
    cout << kq;
}

#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...