제출 #1218598

#제출 시각아이디문제언어결과실행 시간메모리
1218598newsboyPalembang Bridges (APIO15_bridge)C++20
31 / 100
26 ms2580 KiB
#include <iostream> #include <string> #include <vector> #include <algorithm> #include <iomanip> #include <set> #include <map> #include <numeric> #include <iomanip> #include <unordered_set> #include <unordered_map> #include <bitset> #include <queue> #include <deque> #include <stack> #include <cmath> #include <tuple> #include <cassert> #include <array> #include <list> #include <random> #include <initializer_list> using namespace std; using ll = long long; using u64 = unsigned long long; using db = double; using ld = long double; constexpr ll INF = 1E18; constexpr ll MIN = -INF; constexpr ll MAX = INF; constexpr ll N = 1E5; void solve2(ll N) { vector<ll> vec; ll ans = 0; for (ll i = 0; i < N; ++i) { char P, Q; ll s, t; cin >> P >> s >> Q >> t; if (P == Q) { ans += abs(s - t); } else { ans += 1; vec.push_back(s); vec.push_back(t); } } sort(vec.begin(), vec.end()); if (!vec.empty()) { ll Z = vec[(vec.size() - 1) / 2]; for (ll i = 0; i < vec.size(); ++i) { ans += abs(vec[i] - Z); } } cout << ans << '\n'; } void solve() { ll K, N; cin >> K >> N; if (K == 1) { solve2(N); return; } vector<array<ll, 2>> vec; ll add = 0; for (ll i = 0; i < N; ++i) { char P, Q; ll s, t; cin >> P >> s >> Q >> t; if (P == Q) { add += abs(s - t); } else { add += 1; vec.push_back({ s, t }); } } sort(vec.begin(), vec.end(), [&](auto a, auto b) { return a[0] + a[1] < b[0] + b[1]; }); set<ll> ls, rs; ll med; auto push = [&](ll x) -> void { if (rs.empty() || x >= *rs.begin()) { rs.insert(x); } else { ls.insert(x); } while (ll(ls.size()) - 1 > ll(rs.size())) { rs.insert(*--ls.end()); ls.erase(--ls.end()); } while (ls.size() < rs.size()) { ls.insert(*rs.begin()); rs.erase(rs.begin()); } med = *--ls.end(); }; vector<ll> pref(vec.size() + 1), suf(vec.size() + 1); for (ll i = 0; i < vec.size(); ++i) { push(vec[i][0]); push(vec[i][1]); for (ll j = 0; j <= i; ++j) { pref[i + 1] += abs(vec[j][0] - med); pref[i + 1] += abs(vec[j][1] - med); } } ls.clear(); rs.clear(); for (ll i = vec.size() - 1; i >= 0; --i) { push(vec[i][0]); push(vec[i][1]); for (ll j = vec.size() - 1; j >= i; --j) { suf[i] += abs(vec[j][0] - med); suf[i] += abs(vec[j][1] - med); } } ll ans = MAX; for (ll i = 0; i <= vec.size(); ++i) { ans = min(ans, pref[i] + suf[i]); } cout << ans + add << '\n'; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int t = 1; /*cin >> t;*/ while (t--) { solve(); } 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...