Submission #1321709

#TimeUsernameProblemLanguageResultExecution timeMemory
1321709anteknneSightseeing in Kyoto (JOI22_kyoto)C++20
0 / 100
1 ms568 KiB
#include<bits/stdc++.h> #include<ext/pb_ds/assoc_container.hpp> #include<ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; typedef long long ll; typedef long double ld; #define pb push_back #define pii pair<int, int> #define pll pair<ll, ll> #define st first #define nd second #define ordered_set tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> #define debug false const int MAXH = 100 * 1000 + 17; int a[MAXH][2]; pii st[MAXH * 4][2]; vector<pii> vec; int h, W; void buduj (int p, int k, int i, int nr) { if (p == k) { st[i][nr] = {a[p][nr], p}; return; } int sr = (p + k)/ 2; buduj(p, sr, i * 2, nr); buduj(sr + 1, k, i * 2 + 1, nr); st[i][nr] = min(st[i * 2][nr], st[i * 2 + 1][nr]); } pii odczytaj (int p, int k, int a, int b, int i, int nr) { if (k < a || p > b) { return {INT_MAX, 0}; } if (a <= p && k <= b) { return st[i][nr]; } int sr = (p + k)/ 2; return min(odczytaj(p, sr, a, b, i * 2, nr), odczytaj(sr + 1, k, a, b, i * 2 + 1, nr)); } void dziel (pii p, pii k) { if (p.nd == k.nd) { for (int i = p.st; i <= k.st; i ++) { vec.pb({i, p.nd}); } return; } if (p.st == k.st) { for (int i = p.nd; i <= k.nd; i ++) { vec.pb({p.st, i}); } return; } pii sr = {-1, -1}; int rek = INT_MAX; if (p.st + 1 <= k.st - 1 && p.nd + 1 <= k.nd - 1) { pii w1 = odczytaj(0, h - 1, p.st + 1, k.st - 1, 1, 0); pii w2 = odczytaj(0, W - 1, p.nd + 1, k.nd - 1, 1, 1); rek = w1.st + w2.st; sr = {w1.nd, w2.nd}; } pii w = odczytaj(0, h - 1, p.st + 1, k.st, 1, 0); int akt = a[p.nd][1] + w.st; if (akt < rek) { rek = akt; sr = {w.nd, p.nd}; } w = odczytaj(0, h - 1, p.st, k.st - 1, 1, 0); akt = a[k.nd][1] + w.st; if (akt < rek) { rek = akt; sr = {w.nd, k.nd}; } w = odczytaj(0, W - 1, p.nd + 1, k.nd, 1, 1); akt = a[p.st][0] + w.st; if (akt < rek) { rek = akt; sr = {p.st, w.nd}; } w = odczytaj(0, W - 1, p.nd, k.nd - 1, 1, 1); akt = a[k.st][0] + w.st; if (akt < rek) { rek = akt; sr = {k.st, w.nd}; } dziel(p, sr); dziel(sr, k); } int main () { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> h >> W; for (int i = 0; i < h; i ++) { cin >> a[i][0]; } for (int i = 0; i < W; i ++) { cin >> a[i][1]; } buduj(0, h - 1, 1, 0); buduj(0, W - 1, 1, 1); dziel({0, 0}, {h - 1, W - 1}); sort(vec.begin(), vec.end()); vec.erase(unique(vec.begin(), vec.end()), vec.end()); ll wyn = 0; for (int i = 0; i < h + W - 2; i ++) { if (vec[i].st == vec[i + 1].st) { wyn += ll(a[vec[i].st][0]); } else { wyn += ll(a[vec[i].nd][1]); } } cout << wyn << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...