Submission #544972

#TimeUsernameProblemLanguageResultExecution timeMemory
544972Sohsoh84Palembang Bridges (APIO15_bridge)C++17
100 / 100
219 ms12180 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll, ll> pll; #define all(x) (x).begin(),(x).end() #define X first #define Y second #define sep ' ' #define endl '\n' #define debug(x) cerr << #x << ": " << x << endl; const ll MAXN = 3e5 + 10; inline pll operator+ (const pll& a, const pll& b) { return {a.X + b.X, a.Y + b.Y}; } inline pll operator- (const pll& a, const pll& b) { return {a.X - b.X, a.Y - b.Y}; } int n, k; ll pref[MAXN], suff[MAXN]; vector<int> vec; pair<int, pll> seg[MAXN]; namespace fenwick { pll fen[MAXN]; inline void init() { fill(fen, fen + MAXN, make_pair(0, 0)); } inline void update(int ind, pll val) { for (++ind; ind < MAXN; ind += ind & -ind) fen[ind] = fen[ind] + val; } inline pll query(int ind) { pll ans = {0, 0}; for (++ind; ind > 0; ind -= ind & -ind) ans = ans + fen[ind]; return ans; } inline int median() { int l = 1, r = MAXN - 5, tot = query(r).X; while (l < r) { int mid = (l + r) >> 1; if (query(mid).X >= (tot + 1) / 2) r = mid; else l = mid + 1; } return l; } inline ll cost() { int med = median(); pll e1 = query(med), e2 = query(MAXN - 5) - e1; return vec[med] * e1.X - e1.Y + e2.Y - e2.X * vec[med]; } } inline int comp_ind(int x) { return lower_bound(all(vec), x) - vec.begin(); } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> k >> n; ll tans = 0; int tn = 0; for (int i = 1; i <= n; i++) { char c1, c2; int a, b; cin >> c1 >> a >> c2 >> b; if (c1 == c2) tans += abs(a - b); else { seg[++tn] = {a + b, {min(a, b), max(a, b)}}; vec.push_back(a); vec.push_back(b); tans++; } } n = tn; vec.push_back(-1); sort(all(vec)); vec.resize(unique(all(vec)) - vec.begin()); sort(seg + 1, seg + n + 1); for (int i = 1; i <= n; i++) { fenwick::update(comp_ind(seg[i].Y.X), {1, seg[i].Y.X}); fenwick::update(comp_ind(seg[i].Y.Y), {1, seg[i].Y.Y}); pref[i] = fenwick::cost(); } fenwick::init(); for (int i = n; i > 0; i--) { fenwick::update(comp_ind(seg[i].Y.X), {1, seg[i].Y.X}); fenwick::update(comp_ind(seg[i].Y.Y), {1, seg[i].Y.Y}); suff[i] = fenwick::cost(); } if (k == 1) return cout << pref[n] + tans << endl, 0; ll ans = pref[n]; for (int i = 0; i <= n; i++) ans = min(ans, pref[i] + suff[i + 1]); cout << ans + tans << endl; 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...