Submission #1251211

#TimeUsernameProblemLanguageResultExecution timeMemory
1251211kaiboyToll (BOI17_toll)C++20
100 / 100
55 ms9544 KiB
#include <algorithm> #include <iostream> using namespace std; const int N_ = 1 << 16; const int K = 5; const int INF = 0x3f3f3f3f; int **st[N_ << 1], n_; int k; int **new_dd(bool zeroes) { int **dd = new int *[k]; for (int a = 0; a < k; a++) { dd[a] = new int[k]; fill_n(dd[a], k, INF); if (zeroes) dd[a][a] = 0; } return dd; } void delete_dd(int **dd) { for (int a = 0; a < k; a++) delete[] dd[a]; delete[] dd; } int **merge(int **dd, int **ee) { int **ff = new_dd(false); for (int a = 0; a < k; a++) for (int b = 0; b < k; b++) for (int c = 0; c < k; c++) ff[a][b] = min(ff[a][b], dd[a][c] + ee[c][b]); return ff; } int **query(int l, int r) { int **pp = new_dd(true), **qq = new_dd(true); for (l += n_, r += n_; l <= r; l >>= 1, r >>= 1) { if (l & 1) { int **dd = merge(pp, st[l++]); delete_dd(pp), pp = dd; } if (!(r & 1)) { int **dd = merge(st[r--], qq); delete_dd(qq), qq = dd; } } int **dd = merge(pp, qq); delete_dd(pp), delete_dd(qq); return dd; } int main() { ios_base::sync_with_stdio(false), cin.tie(NULL); int n, m, q; cin >> k >> n >> m >> q; n = (n - 1) / k; for (n_ = 1; n_ < n; n_ <<= 1) ; for (int i = 0; i < n_; i++) st[i + n_] = new_dd(false); while (m--) { int i, j, w; cin >> i >> j >> w; st[i / k + n_][i % k][j % k] = w; } for (int i = n_ - 1; i; i--) { int l = i << 1, r = l ^ 1; st[i] = merge(st[l], st[r]); } while (q--) { int i, j; cin >> i >> j; int l = i / k, a = i % k; int r = j / k, b = j % k; if (l == r) { cout << "-1\n"; continue; } r--; int **dd = query(l, r), d = dd[a][b]; if (d == INF) d = -1; cout << d << '\n'; delete_dd(dd); } 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...