Submission #1133346

#TimeUsernameProblemLanguageResultExecution timeMemory
1133346pokmui9909Treatment Project (JOI20_treatment)C++17
100 / 100
375 ms150752 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

#define x first
#define y second

ll N, M, T[100005], L[100005], R[100005], C[100005], D[100005];
vector<ll> G[100005];

set<pair<ll, ll>> Coord[100005];
struct SegTree{
    set<pair<ll, ll>> T[400005];
    void init(ll n, ll s, ll e){
        if(s == e){
            T[n] = Coord[s]; return;
        }
        ll m = (s + e) / 2;
        init(n * 2, s, m); init(n * 2 + 1, m + 1, e);
        T[n] = T[n * 2];
        for(auto f : T[n * 2 + 1]) T[n].insert(f);
    }
    void qry(ll n, ll s, ll e, ll r, ll t, vector<ll> &V){
        if(s > r) return;
        if(e <= r){
            for(auto it = T[n].begin(); it != T[n].end(); ){
                if(it->x <= t){
                    V.push_back(it->y);
                    it = T[n].erase(it);
                } else {
                    break;
                }
            }
            return;
        }
        ll m = (s + e) / 2;
        qry(n * 2, s, m, r, t, V); qry(n * 2 + 1, m + 1, e, r, t, V);
    }
}seg;

int main(){
    cin.tie(0) -> sync_with_stdio(0);

    cin >> N >> M;
    fill(D, D + 100005, 1e18);
    priority_queue<pair<ll, ll>> PQ;
    vector<ll> cp;
    for(ll i = 1; i <= M; i++){
        cin >> T[i] >> L[i] >> R[i] >> C[i];
        R[i]++;
        if(L[i] == 1){
            D[i] = C[i]; PQ.push({-C[i], i});
        }
        cp.push_back(L[i] - T[i]);
    }
    sort(cp.begin(), cp.end());
    cp.erase(unique(cp.begin(), cp.end()), cp.end());
    for(ll i = 1; i <= M; i++){
        if(L[i] == 1) continue;
        Coord[lower_bound(cp.begin(), cp.end(), L[i] - T[i]) - cp.begin() + 1].insert({L[i] + T[i], i});
    }
    seg.init(1, 1, 100000);
    ll Ans = 1e18;
    while(!PQ.empty()){
        ll c = -PQ.top().x, u = PQ.top().y; PQ.pop();
        if(R[u] == N + 1){
            Ans = min(Ans, c);
        }
        vector<ll> V;
        seg.qry(1, 1, 100000, upper_bound(cp.begin(), cp.end(), R[u] - T[u]) - cp.begin(), R[u] + T[u], V);
        for(auto v : V){
            if(D[v] <= D[u] + C[v]) continue;
            D[v] = D[u] + C[v];
            PQ.push({-D[v], v});
        }
    }
    cout << (Ans == 1e18 ? -1 : Ans);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...