이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#define int long long
using namespace std;
signed main(){
cin.tie(0);
ios::sync_with_stdio(0);
int k, n, m, o, L = 16, INF = numeric_limits<int>::max()/8;
cin >> k >> n >> m >> o;
vector< vector< vector< vector<int> > > > g(L, vector< vector< vector<int> > >((n+k-1)/k, vector< vector<int> >(k, vector<int>(k, INF))));
while(m--){
int a, b, t;
cin >> a >> b >> t;
g[0][a/k][a%k][b%k] = t;
}
for(int i = 1; i < L; i++)
for(int j = 0; j < (n+k-1)/k-(1<<i); j++)
for(int u = 0; u < k; u++)
for(int v = 0; v < k; v++)
for(int w = 0; w < k; w++)
g[i][j][u][v] = min(g[i][j][u][v], g[i-1][j][u][w]+g[i-1][j+(1<<(i-1))][w][v]);
while(o--){
int a, b, pos;
cin >> a >> b;
if(a/k == b/k){
cout << "-1\n";
continue;
}
vector<int> dis(k, INF);
dis[a%k] = 0;
pos = a/k;
for(int i = L-1; i >= 0; i--){
if(pos + (1<<i) > b/k) continue;
vector<int> newdis(k, INF);
for(int u = 0; u < k; u++)
for(int v = 0; v < k; v++)
newdis[v] = min(newdis[v], dis[u]+g[i][pos][u][v]);
dis = newdis;
pos += (1<<i);
}
cout << (dis[b%k]==INF?-1:dis[b%k]) << "\n";
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |