Submission #1052379

#TimeUsernameProblemLanguageResultExecution timeMemory
1052379hotboy2703Treatment Project (JOI20_treatment)C++17
100 / 100
465 ms105420 KiB
#include<bits/stdc++.h>
using ll = long long;
using namespace std;
#define pll pair <ll,ll>
#define fi first
#define se second
#define MP make_pair
#define sz(a) (ll((a).size()))
#define BIT(mask,i) (((mask) >> (i))&1)
#define MASK(i) (1LL << (i))
const ll MAXN = 1e5+100;
const ll INF = 1e18;
ll dp[MAXN];
struct treatment{
    ll t,l,r,c;
};
treatment a[MAXN];
vector <pll> tree1[MAXN*4],tree2[MAXN*4];
vector <ll> val_t;
void update(ll id,ll l,ll r,ll pos){
    if (val_t[l] > a[pos].t || val_t[r] < a[pos].t)return;
    tree1[id].push_back(MP(a[pos].l - a[pos].t,pos));
    tree2[id].push_back(MP(a[pos].l + a[pos].t,pos));   
    if (l == r){
        return;
    }
    ll mid = (l + r) >> 1;
    update(id<<1,l,mid,pos);
    update(id<<1|1,mid+1,r,pos);
}
void build(ll id,ll l,ll r){
    sort(tree1[id].begin(),tree1[id].end(),greater <>());
    sort(tree2[id].begin(),tree2[id].end(),greater <>());
    if (l != r){
        ll mid = (l + r) >> 1;
        build(id<<1,l,mid);
        build(id<<1|1,mid+1,r);
    }
}
vector <ll> all;
void get1(ll id,ll l,ll r,ll pos){
    if (val_t[l] > a[pos].t)return;
    if (val_t[r] <= a[pos].t){
        while (!tree1[id].empty() && tree1[id].back().fi <= a[pos].r - a[pos].t + 1){
            all.push_back(tree1[id].back().se);
            tree1[id].pop_back();
        }
        return;
    }
    ll mid = (l + r) >> 1;
    get1(id<<1,l,mid,pos);
    get1(id<<1|1,mid+1,r,pos);
}
void get2(ll id,ll l,ll r,ll pos){
    if (val_t[r] < a[pos].t)return;
    if (val_t[l] >= a[pos].t){
            while (!tree2[id].empty() && tree2[id].back().fi <= a[pos].r + a[pos].t + 1){
            all.push_back(tree2[id].back().se);
            tree2[id].pop_back();
        }
        return;
    }
    ll mid = (l + r) >> 1;
    get2(id<<1,l,mid,pos);
    get2(id<<1|1,mid+1,r,pos);
}
ll n,m;

int main(){
    ios_base::sync_with_stdio(0);cin.tie(nullptr);
    cin>>n>>m;
    for (ll i = 1;i <= m;i ++){
        cin>>a[i].t>>a[i].l>>a[i].r>>a[i].c;
        val_t.push_back(a[i].t);
    }
    sort(val_t.begin(),val_t.end());
    val_t.resize(unique(val_t.begin(),val_t.end())-val_t.begin());
    val_t.insert(val_t.begin(),0);
    for (ll i = 1;i <= m;i ++)update(1,1,sz(val_t)-1,i);
    build(1,1,sz(val_t)-1);
    priority_queue <pll,vector <pll> ,greater <> > q;
    for (ll i = 1;i <= m;i ++){
        if (a[i].l == 1){dp[i] = a[i].c;q.push(MP(a[i].c,i));}
        else dp[i] = INF;
    }
    while (!q.empty()){
        ll u = q.top().se;
        q.pop();
        all.clear();
        get1(1,1,sz(val_t)-1,u);
        get2(1,1,sz(val_t)-1,u);
        for (auto v:all){
            // cout<<v<<
            if (dp[v] == INF){
                dp[v] = dp[u] + a[v].c;
                q.push(MP(dp[v],v));
            }
        }
    }
    ll ans = INF;
    for (ll i = 1;i <= m;i ++)if (a[i].r == n)ans = min(ans,dp[i]);
    if (ans == INF)ans = -1;
cout<<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...