Submission #1123193

#TimeUsernameProblemLanguageResultExecution timeMemory
1123193asli_bgToll (BOI17_toll)C++20
100 / 100
307 ms12916 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long

#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define sp <<' '<<
#define pb push_back

#define FOR(i,a) for(int i=0;i<(a);i++)
#define FORE(i,a,b) for(int i=(a);i<(b);i++)

#define cont(a) for(auto el:a) cout<<el<<' '; cout<<endl;
#define contp(a) for(auto el:a) cout<<el.fi<<'-'<<el.se<<' ';cout<<endl;

#define DEBUG(x) cout<<#x sp ":" sp x<<endl;

typedef vector<int> vi;
typedef pair<int,int> pii;
typedef vector<pii> vii;
typedef long long ll;

#define topla(x,y) ((x%MOD)+(y%MOD))%MOD
#define carp(x,y) ((x%MOD)*(y%+MOD))%MOD

const int MAXN=5e4+5;
const int INF=1e18;

#define mid ((l+r)/2)

int n,m,k,o;
vii adj[MAXN], revadj[MAXN];
int cev[MAXN], bb[MAXN], dist[MAXN];

void dij(int bas,int l,int r){
    priority_queue<pii,vii,greater<pii>> pq;

    FOR(i,n) dist[i]=INF;
    dist[bas]=0;

    pq.push({0,bas});

    while(!pq.empty()){
        auto el=pq.top();
        pq.pop();

        int d=el.fi;
        int nd=el.se;

        for(auto [kom,cost]:adj[nd]){
            if(bb[kom]<l or bb[kom]>r) continue;
            if(dist[nd]+cost<dist[kom]){
                dist[kom]=dist[nd]+cost;
                pq.push({dist[kom],kom});
            }
        }
    }

    pq.push({0,bas});

    while(!pq.empty()){
        auto el=pq.top();
        pq.pop();

        int d=el.fi;
        int nd=el.se;

        for(auto [kom,cost]:revadj[nd]){
            if(bb[kom]<l or bb[kom]>r) continue;

            if(dist[nd]+cost<dist[kom]){
                dist[kom]=dist[nd]+cost;
                pq.push({dist[kom],kom});
            }

        }
    }
}

void solve(int l,int r,vector<pair<pii,int>>& qq){
    if(l>r or qq.empty()) return;

    for(int i=mid*k;i<min(mid*k+k,n);i++){
        dij(i,l,r);
        for(auto el:qq){
            int bas=el.fi.fi;
            int son=el.fi.se;
            int ind=el.se;

            if(bb[bas]<=mid and mid<=bb[son]) cev[ind]=min(cev[ind],dist[bas]+dist[son]);
        }
    }

    vector<pair<pii,int>> sag,sol;
    for(auto el:qq){
        if(bb[el.fi.se]<mid) sol.pb(el);
        if(bb[el.fi.fi]>mid) sag.pb(el);
    }

    solve(l,mid,sol);
    solve(mid+1,r,sag);
}


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

    cin>>k>>n>>m>>o;
    FOR(i,m){
        int a,b,t;
        cin>>a>>b>>t;
        adj[a].pb({b,t});
        revadj[b].pb({a,t});
    }

    FOR(i,n) bb[i]=i/k;
    FORE(i,1,o+1) cev[i]=INF; 

    vector<pair<pii,int>> qq;
    int say=1;
    while(o--){
        int a,b;
        cin>>a>>b;
        qq.pb({{a,b},say++});
    }

    solve(0,bb[n-1],qq);
    FORE(i,1,say) cout<<(cev[i]==INF?-1:cev[i])<<endl;
}
#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...