Submission #1111194

#TimeUsernameProblemLanguageResultExecution timeMemory
1111194vladiliusPalembang Bridges (APIO15_bridge)C++17
63 / 100
442 ms262144 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using pii = pair<int, int>; using pil = pair<int, ll>; #define pb push_back #define ff first #define ss second const ll inf = numeric_limits<ll> :: max(); struct DS{ struct node{ int s1; ll s2; node *l, *r; node(){ s1 = s2 = 0; l = r = 0; } node(int x, ll y){ s1 = x; s2 = y; l = r = 0; } node(node *ls, node *rs){ l = ls; r = rs; s1 = s2 = 0; if (l){ s1 += l -> s1; s2 += l -> s2; } if (r){ s1 += r -> s1; s2 += r -> s2; } } }; node *rt; int n, cc; void init(){ rt = new node(); n = 1e9; cc = 0; } node* upd(node *v, int tl, int tr, int& p, int& x){ if (tl == tr){ return new node(v -> s1 + 1, v -> s2 + x); } int tm = (tl + tr) / 2; if (p <= tm){ if (!(v -> l)) v -> l = new node(); return new node(upd(v -> l, tl, tm, p, x), v -> r); } else { if (!(v -> r)) v -> r = new node(); return new node(v -> l, upd(v -> r, tm + 1, tr, p, x)); } } void upd(int p, int x){ rt = upd(rt, 1, n, p, x); } pil get(node *v, int tl, int tr, int& l, int& r){ if (l > tr || r < tl) return {0, 0}; if (l <= tl && tr <= r){ return {v -> s1, v -> s2}; } int tm = (tl + tr) / 2; pil p1 = {0, 0}, p2 = {0, 0}; if (v -> l) p1 = get(v -> l, tl, tm, l, r); if (v -> r) p2 = get(v -> r, tm + 1, tr, l, r); return {p1.ff + p2.ff, p1.ss + p2.ss}; } pair<int, ll> get(int l, int r){ return get(rt, 1, n, l, r); } multiset<int> s1, s2; void add(int x){ cc++; s1.insert(x); if (s1.size() > s2.size()){ int y = *prev(s1.end()); s1.erase(s1.find(y)); s2.insert(y); } if (!s1.empty() && !s2.empty()){ int a = *prev(s1.end()), b = *s2.begin(); if (a > b){ s1.erase(s1.find(a)); s2.erase(s2.find(b)); s1.insert(b); s2.insert(a); } } upd(x, x); } ll get(){ if (s2.empty()) return 0; int x = (cc % 2) ? *s2.begin() : *prev(s1.end()); pil p1 = get(1, x), p2 = get(x + 1, n); return (1LL * x * p1.ff - p1.ss) + (p2.ss - 1LL * x * p2.ff); } }; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int k, n; cin>>k>>n; vector<pii> all; ll out = 0; while (n--){ char t1, t2; int x1, y1; cin>>t1>>x1>>t2>>y1; if (t1 == t2){ out += abs(x1 - y1); continue; } if (x1 > y1) swap(x1, y1); all.pb({x1, y1}); } n = (int) all.size(); vector<int> imp; for (auto [x, y]: all){ imp.pb(x); imp.pb(y); } ll mn = inf; if (k == 1){ if (!all.empty()){ sort(imp.begin(), imp.end()); int x = imp[(int) (imp.size() - 1) / 2]; ll sum = 0; for (int i: imp){ sum += abs(i - x); } mn = sum + n; } } else { vector<pii> f; for (int i = 0; i < n; i++){ f.pb({all[i].ff + all[i].ss, i}); } sort(f.begin(), f.end()); vector<ll> f1(n + 1); DS T1; T1.init(); for (int i = 1; i <= n; i++){ auto [x, y] = all[f[i - 1].ss]; T1.add(x); T1.add(y); f1[i] = T1.get(); } vector<ll> f2(n + 2); DS T2; T2.init(); for (int i = n; i > 0; i--){ auto [x, y] = all[f[i - 1].ss]; T2.add(x); T2.add(y); f2[i] = T2.get(); } for (int i = 0; i <= n; i++){ mn = min(mn, f1[i] + f2[i + 1] + n); } } if (mn == inf) mn = 0; cout<<out + mn<<"\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...