Submission #308068

#TimeUsernameProblemLanguageResultExecution timeMemory
308068Vince729Toll (BOI17_toll)C++11
100 / 100
171 ms91768 KiB
#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 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...