Submission #1176333

#TimeUsernameProblemLanguageResultExecution timeMemory
1176333nguyenkhangninh99Fuel Station (NOI20_fuelstation)C++17
13 / 100
249 ms31172 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];
 
    if (l != r){
        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);
        return;
    }
 
    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]);
}
 
 
void solve(){
   int n, d;cin >> n >> d;

    for(int i = 1; i <= n; i++) cin >> tram[i].x >> tram[i].a >> tram[i].b;
    
    sort(tram + 1, tram + n + 1, cmp);

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

        map<int, vector<int>> mp;

        for(int i = 1; i <= n; i++){
            v.push_back(tram[i].b);
            mp[tram[i].b].push_back(i);
        }

        sort(v.begin(), v.end());
        v.erase(unique(v.begin(), v.end()), v.end());
        for(int i = 1; i <= n; 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;
}

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    solve();
}

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