Submission #1162745

#TimeUsernameProblemLanguageResultExecution timeMemory
1162745AlgorithmWarriorToll (BOI17_toll)C++20
100 / 100
146 ms18064 KiB
#include <bits/stdc++.h> using namespace std; int const INF=1e9; int const MAX=5e4+5; int const LOG=18; int k,n,m,q; int dist[MAX][LOG][5]; void read(){ cin>>k>>n>>m>>q; int i; for(i=1;i<=m;++i){ int u,v,w; cin>>u>>v>>w; dist[u][0][v%k]=w; } } void minself(int& x,int val){ if(x>val) x=val; } void precalc(){ int i,j,rest,inter; for(i=0;i<n;++i) for(j=0;j<LOG;++j) for(rest=0;rest<k;++rest) if(!dist[i][j][rest]) dist[i][j][rest]=INF; for(j=1;j<LOG;++j) for(i=0;i<n;++i) for(rest=0;rest<k;++rest) for(inter=0;inter<k;++inter) if(i/k*k+k*(1<<(j-1))+inter<n) minself(dist[i][j][rest],dist[i][j-1][inter]+dist[i/k*k+k*(1<<(j-1))+inter][j-1][rest]); } int solve(int u,int v){ int hu=u/k; int hv=v/k; int difh=hv-hu; vector<int>nodes(k); vector<int>dst(k); int i; for(i=0;i<k;++i){ nodes[i]=u/k*k+i; if(u==nodes[i]) dst[i]=0; else dst[i]=INF; } int bit; for(bit=0;(1<<bit)<=difh;++bit) if(difh&(1<<bit)){ vector<int>new_nodes(k); vector<int>new_dst(k); int rest,inter; for(rest=0;rest<k;++rest){ new_nodes[rest]=nodes[rest]+k*(1<<bit); new_dst[rest]=INF; } for(rest=0;rest<k;++rest) for(inter=0;inter<k;++inter) minself(new_dst[rest],dst[inter]+dist[nodes[inter]][bit][rest]); for(rest=0;rest<k;++rest){ nodes[rest]=new_nodes[rest]; dst[rest]=new_dst[rest]; } } if(dst[v%k]<INF) return dst[v%k]; return -1; } void process_queries(){ int i; for(i=1;i<=q;++i){ int u,v; cin>>u>>v; cout<<solve(u,v)<<'\n'; } } int main() { read(); precalc(); process_queries(); 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...