This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 50002;
const int MAXK = 5;
const int MOD = 1000000007;
int K, N, M, O;
int dp[MAXN][18][MAXK][MAXK];
int ans[MAXK][MAXK], tmp[MAXK][MAXK];
void minimize(int x[MAXK][MAXK], int a[MAXK][MAXK], int b[MAXK][MAXK]) {
for (int i = 0; i < K; i++) {
for (int j = 0; j < K; j++) {
for (int k = 0; k < K; k++) {
x[i][j] = min(x[i][j], a[i][k]+b[k][j]);
}
}
}
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0);
cin >> K >> N >> M >> O;
memset(dp, 0x3f, sizeof dp);
for (int i = 0; i < M; i++) {
int a, b, t;
cin >> a >> b >> t;
dp[a/K][0][a%K][b%K] = t;
}
for (int i = 1; i < 18; i++) {
for (int j = 0; j < (N+K-1)/K-(1<<i); j++) {
minimize(dp[j][i], dp[j][i-1], dp[j+(1<<(i-1))][i-1]);
}
}
for (int o = 0; o < O; o++) {
int a, b; cin >> a >> b;
memset(ans, 0x3f, sizeof ans);
for (int i = 0; i < K; i++) ans[i][i] = 0;
int cur = a/K, dest = b/K;
for (int i = 17; i >= 0; i--) {
if (cur + (1<<i) <= dest) {
memset(tmp, 0x3f, sizeof tmp);
minimize(tmp, ans, dp[cur][i]);
memcpy(ans, tmp, sizeof ans);
cur += (1<<i);
}
}
if (ans[a%K][b%K] == 0x3f3f3f3f) cout << -1;
else cout << ans[a%K][b%K];
cout << "\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... |