Submission #162270

#TimeUsernameProblemLanguageResultExecution timeMemory
162270rama_pangPalembang Bridges (APIO15_bridge)C++14
31 / 100
132 ms5272 KiB
#include <bits/stdc++.h> using namespace std; using lint = long long; lint K, N; lint ans; vector<pair<lint, lint>> A; inline lint labs(lint x) { if (x < 0) return -x; return x; } lint solve_1() { vector<lint> points; for (int i = 0; i < N; i++) { points.emplace_back(A[i].first); points.emplace_back(A[i].second); } sort(points.begin(), points.end()); lint res = 0; for (int i = 0; i < N; i++) res -= points[i]; for (int i = N; i < N + N; i++) res += points[i]; return res; } lint solve_2() { if (N == 0) return 0; auto calc = [&](lint B1, lint B2) { lint res = 0; for (lint i = 0; i < N; i++) { res += min(labs(B1 - A[i].first) + labs(B1 - A[i].second), labs(B2 - A[i].first) + labs(B2 - A[i].second)); } return (lint)res; }; lint res = INT64_MAX; vector<lint> points; for (int i = 0; i < N; i++) { points.emplace_back(A[i].first); points.emplace_back(A[i].second); } sort(points.begin(), points.end()); for (lint i = 0; i < points.size(); i++) { lint le = i, ri = points.size() - 1; while (le <= ri) { lint mid = (le + ri) / 2; if (mid + 1 >= points.size()) { ri--; continue; } else if (mid < 0) { le++; continue; } else { lint l = calc(points[i], points[mid]), r = calc(points[i], points[mid + 1]); res = min(res, l), res = min(res, r); if (l < r) { ri = mid - 1; } else { le = mid + 2; } } } } return res; } lint solve() { sort(A.begin(), A.end()); N = A.size(); if (K == 1) return N + solve_1(); else return N + solve_2(); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> K >> N; for (int i = 0; i < N; i++) { char Z1, Z2; lint B1, B2; cin >> Z1 >> B1 >> Z2 >> B2; if (B1 > B2) swap(B1, B2); if (Z1 == Z2) ans += B2 - B1; else A.emplace_back(B1, B2); } ans += solve(); cout << ans << "\n"; return 0; }

Compilation message (stderr)

bridge.cpp: In function 'lint solve_2()':
bridge.cpp:60:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (lint i = 0; i < points.size(); i++) {
                      ~~^~~~~~~~~~~~~~~
bridge.cpp:65:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             if (mid + 1 >= points.size()) {
                 ~~~~~~~~^~~~~~~~~~~~~~~~
#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...