Submission #1196088

#TimeUsernameProblemLanguageResultExecution timeMemory
1196088aykhnToll (BOI17_toll)C++20
100 / 100
71 ms35912 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define inf 0x3F3F3F3F3F3F3F const int MXN = 5e4 + 5; struct DATA { int a[5][5]; }; int K; DATA st[MXN << 2]; DATA arr[MXN]; DATA combine(DATA x, DATA y, DATA z) { if (y.a[0][0] == -1) return x; if (x.a[0][0] == -1) return y; DATA res; for (int i = 0; i < K; i++) for (int j = 0; j < K; j++) res.a[i][j] = inf; for (int L = 0; L < K; L++) { for (int i = 0; i < K; i++) { for (int j = 0; j < K; j++) { for (int R = 0; R < K; R++) { res.a[L][R] = min(res.a[L][R], x.a[L][i] + z.a[i][j] + y.a[j][R]); } } } } return res; } void build(int l, int r, int x) { if (l == r) { for (int i = 0; i < K; i++) for (int j = 0; j < K; j++) st[x].a[i][j] = (i == j ? 0 : inf); return; } int mid = (l + r) >> 1; build(l, mid, 2*x); build(mid + 1, r, 2*x + 1); st[x] = combine(st[2*x], st[2*x + 1], arr[mid]); } DATA get(int l, int r, int x, int lx, int rx) { if (l > rx || r < lx) { DATA x; x.a[0][0] = -1; return x; } if (l >= lx && r <= rx) return st[x]; int mid = (l + r) >> 1; return combine(get(l, mid, 2*x, lx, rx), get(mid + 1, r, 2*x + 1, lx, rx), arr[mid]); } void _() { int n, m, q; cin >> K >> n >> m >> q; while (n % K) n++; for (int i = 0; i < n / K; i++) for (int j = 0; j < K; j++) for (int k = 0; k < K; k++) arr[i].a[j][k] = inf; while (m--) { int a, b, t; cin >> a >> b >> t; arr[a / K].a[a % K][b % K] = min(arr[a / K].a[a % K][b % K], t); } build(0, n / K - 1, 1); while (q--) { int a, b; cin >> a >> b; DATA x = get(0, n / K - 1, 1, a / K, b / K); cout << (x.a[a % K][b % K] >= inf ? -1 : x.a[a % K][b % K]) << '\n'; } } signed main() { ios::sync_with_stdio(0); cin.tie(0); int t = 1; // cin >> t; while (t--) _(); }
#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...