Submission #1300832

#TimeUsernameProblemLanguageResultExecution timeMemory
1300832boss_zzToll (BOI17_toll)C++20
0 / 100
87 ms9020 KiB
#include<bits/stdc++.h>
#define rep(a,b,c) for(ll a=b;a<=c;++a)
#define ll long long 
#define ff first 
#define ss second 
#define mp make_pair 
using namespace std;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
const ll N=5e4+5,inf=1e18;
ll n,m,k,q,ans[N],dis[5][N];
vector<pll> adj_pos[N],adj_opp[N];
vector<pair<pll,ll> > QQ;
ll left(ll x){return x*k;}
ll right(ll x){return x*k+k-1;}
ll ID(ll x){return x/k;}
void dij(ll start,vector<pll> *adj,ll *dis,ll L,ll R){
    rep(i,L,R) dis[i]=inf;
    dis[start]=0;
    priority_queue<pll,vector<pll>,greater<pll> > pq;
    pq.push(mp(0,start));
    while(!pq.empty()){
        ll u=pq.top().ss,cost=pq.top().ff;pq.pop();
        if(cost>dis[u]) continue;
        for(auto o:adj[u]){
            ll v=o.ff,w=o.ss;
            if(!(L<=v&&v<=R)) continue;
            if(dis[u]+w<dis[v]){
                dis[v]=dis[u]+w;
                pq.push(mp(dis[v],v));
            }
        }
    }
}
void DC(ll l,ll r,vector<pair<pll,ll> > &qry){
    if(l==r){
        for(auto o:qry){
            ll L=o.ff.ff,R=o.ff.ss,id=o.ss;
            ans[id]=-1;
        }
        return ;
    }
    ll mid=(l+r)>>1;
    rep(i,left(mid),right(mid)){
        dij(i,adj_opp,dis[i-left(mid)],left(l),right(mid-1));
        dij(i,adj_pos,dis[i-left(mid)],left(mid+1),right(r));
    }
    vector<pair<pll,ll> > lft,rgt;
    for(auto o:qry){
        ll L=o.ff.ff,R=o.ff.ss,id=o.ss;
        if(ID(L)>mid) rgt.push_back(o);
        else if(ID(R)<=mid) lft.push_back(o);
        else{
            ans[id]=inf;
            rep(i,0,4) ans[id]=min(ans[id],dis[i][L]+dis[i][R]);
            if(ans[id]==inf) ans[id]=-1;
        }
    }
    vector<pair<pll,ll> >().swap(qry);
    DC(l,mid,lft);
    DC(mid+1,r,rgt);
}
signed main(){
    ios::sync_with_stdio(0);cin.tie(0);
    cin>>k>>n>>m>>q;
    rep(i,1,m){
        ll u,v,w;
        cin>>u>>v>>w;
        adj_pos[u].push_back(mp(v,w));
        adj_opp[v].push_back(mp(u,w));
    }
    rep(i,1,q){
        ll u,v;
        cin>>u>>v;
        QQ.push_back(mp(mp(u,v),i));
    }
    DC(0,n/k,QQ);
    rep(i,1,q) cout<<ans[i]<<'\n';
    return 0;
}
#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...