Submission #1157745

#TimeUsernameProblemLanguageResultExecution timeMemory
1157745ReLiceRobot (JOI21_ho_t4)C++20
100 / 100
367 ms54148 KiB
#include <bits/stdc++.h>
#define ll long long
#define ld double
#define pb push_back
#define pf push_front
#define ins insert
#define fr first
#define sc second
#define endl "\n"
#define ar array
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()

using namespace std;
void start(){ios_base::sync_with_stdio(NULL);cin.tie(nullptr);cout.tie(nullptr);}

const ll inf = 1e17;
const ll mod = 1e9 + 7;
const ll N = 1e5 + 8;

vector<vector<vector<pair<ll,ll>>>> g(N);
vector<vector<ll>> vv(N), sum(N), mn(N);

ll d[N];
bool vis[N];

void bfs(ll v){
    // all except y of the same color, mn[col[y]], price[y]

    memset(d, 0x3f, sizeof(d));
    set<pair<ll,ll>> q;

    d[v] = 0;
    q.ins({0, v});

    while(!q.empty()){
        auto [dd, x] = *q.begin();
        vis[x] = 1;

        q.erase(q.begin());

        if(dd != d[x]) continue;

        for(ll i=0;i<(ll)vv[x].size();i++){

            for(auto [p, to] : g[x][i]){
                if(vis[to]) continue;

                ll res = min(d[x] + min(p, sum[x][i] - p), mn[x][i] - p);

                if(res < d[to]){
                    d[to] = res;
                    q.ins({d[to], to});
                }

                ll col = lower_bound(all(vv[to]), vv[x][i]) - vv[to].begin();

                if(d[x] + p + sum[to][col] - p < mn[to][col]){
                    mn[to][col] = d[x] + p + sum[to][col] - p;
                }
            }
        }

    }
}

void solve() {
    ll i, j;

    ll n, m;
    cin>>n>>m;

    ll a[m], b[m], c[m], dd[m];

    for(i=0;i<m;i++){
        cin>>a[i]>>b[i]>>c[i]>>dd[i];

        vv[a[i]].pb(c[i]);
        vv[b[i]].pb(c[i]);
    }

    for(i=1;i<=n;i++){
        sort(all(vv[i]));
        vv[i].erase(unique(all(vv[i])), vv[i].end());

        g[i].resize(vv[i].size());
        sum[i].resize(vv[i].size());
        mn[i].resize(vv[i].size(), inf);
    }

    for(i=0;i<m;i++){
        ll low = lower_bound(all(vv[a[i]]), c[i]) - vv[a[i]].begin();
        g[a[i]][low].pb({dd[i], b[i]});
        sum[a[i]][low] += dd[i];

        low = lower_bound(all(vv[b[i]]), c[i]) - vv[b[i]].begin();
        g[b[i]][low].pb({dd[i], a[i]});
        sum[b[i]][low] += dd[i];
    }

    bfs(1);

    if(d[n] >= d[0]) cout<<-1<<endl;
    else cout<<d[n]<<endl;
}

signed main(){
    start();

    ll t = 1;
    //cin>>t;

    while(t--) solve();
}

/*

*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...