Submission #46591

#TimeUsernameProblemLanguageResultExecution timeMemory
46591aomePalembang Bridges (APIO15_bridge)C++17
100 / 100
341 ms40240 KiB
#include <bits/stdc++.h> using namespace std; const int N = 100005; int m, n; long long res; long long f[2][N]; pair<int, int> a[N]; vector< pair<int, int> > vec; struct SegmentTree { pair<int, long long> T[4 * 2 * N]; void init() { for (int i = 0; i < 4 * 2 * N; ++i) T[i] = {0, 0}; } #define mid ((l + r) >> 1) void upd(int i, int l, int r, int p) { if (l == r) { T[i] = {1, vec[l].first}; return; } if (mid >= p) upd(i << 1, l, mid, p); else upd(i << 1 | 1, mid + 1, r, p); T[i] = {T[i << 1].first + T[i << 1 | 1].first, T[i << 1].second + T[i << 1 | 1].second}; } int find(int i, int l, int r, int k) { if (l == r) return l; if (k <= T[i << 1].first) return find(i << 1, l, mid, k); return find(i << 1 | 1, mid + 1, r, k - T[i << 1].first); } long long get(int i, int l, int r, int L, int R) { if (L > r || l > R) return 0; if (L <= l && r <= R) return T[i].second; return get(i << 1, l, mid, L, R) + get(i << 1 | 1, mid + 1, r, L, R); } #undef mid } IT; int main() { ios::sync_with_stdio(false); cin >> m >> n; int cnt = 0; for (int i = 1; i <= n; ++i) { char x, y; ++cnt; cin >> x >> a[cnt].first >> y >> a[cnt].second; if (a[cnt].first > a[cnt].second) { swap(a[cnt].first, a[cnt].second); } if (x == y) res += a[cnt].second - a[cnt].first, cnt--; } n = cnt; sort(a + 1, a + 1 + n, [&] (pair<int, int> x, pair<int, int> y) { return x.first + x.second < y.first + y.second; }); for (int i = 1; i <= n; ++i) { vec.push_back({a[i].first, i * 2}), vec.push_back({a[i].second, i * 2 + 1}); } sort(vec.begin(), vec.end()); for (int i = 1; i <= n; ++i) { a[i].first = lower_bound(vec.begin(), vec.end(), make_pair(a[i].first, i * 2)) - vec.begin(); a[i].second = lower_bound(vec.begin(), vec.end(), make_pair(a[i].second, i * 2 + 1)) - vec.begin(); } IT.init(); for (int i = 1; i <= n; ++i) { IT.upd(1, 0, n * 2 - 1, a[i].first); IT.upd(1, 0, n * 2 - 1, a[i].second); int p = IT.find(1, 0, n * 2 - 1, i); f[0][i] = IT.get(1, 0, n * 2 - 1, p + 1, n * 2 - 1) - IT.get(1, 0, n * 2 - 1, 0, p); } IT.init(); for (int i = n; i >= 1; --i) { IT.upd(1, 0, n * 2 - 1, a[i].first); IT.upd(1, 0, n * 2 - 1, a[i].second); int p = IT.find(1, 0, n * 2 - 1, n - i + 1); f[1][i] = IT.get(1, 0, n * 2 - 1, p + 1, n * 2 - 1) - IT.get(1, 0, n * 2 - 1, 0, p); } if (m == 1) cout << f[0][n] + res + n; else { long long mn = 1e18; for (int i = 0; i <= n; ++i) mn = min(mn, f[0][i] + f[1][i + 1]); cout << mn + res + 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...