Submission #937441

#TimeUsernameProblemLanguageResultExecution timeMemory
937441duckindogPalembang Bridges (APIO15_bridge)C++17
31 / 100
2035 ms15992 KiB
//from duckindog wth depression #pragma GCC optimize("Ofast") #pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") #include<bits/stdc++.h> using namespace std; const int N = 100'000 + 10; int k, n; long long bridge(vector<pair<int, int>> x) { int n = x.size(); if (!n) return 0; set<int> pos; vector<int> a(n + 1), b(n + 1); for (int i = 1; i <= n; ++i) { a[i] = x[i - 1].first; b[i] = x[i - 1].second; pos.insert(a[i]); pos.insert(b[i]); } sort(a.begin(), a.end()); sort(b.begin(), b.end()); vector<long long> da(n + 1), db(n + 1); for (int i = 1; i <= n; ++i) { da[i] = da[i - 1] + a[i]; db[i] = db[i - 1] + b[i]; } auto cal = [&](int i) { auto itA = upper_bound(a.begin(), a.end(), i) - a.begin() - 1, itB = upper_bound(b.begin(), b.end(), i) - b.begin() - 1; long long ret = 0; ret += 1ll * itA * i - da[itA] + da[n] - da[itA] - 1ll * i * (n - itA); ret += 1ll * itB * i - db[itB] + db[n] - db[itB] - 1ll * i * (n - itB); return ret; }; long long ret = 1'000'000'000'000'000; for (const auto& i : pos) { if (i == *pos.begin()) continue; int l = *prev(pos.lower_bound(i)); int r = i, it = l; while (l <= r) { int mid = l + r >> 1; if (cal(mid) >= cal(mid + 1)) l = it = mid + 1; else r = mid - 1; } ret = min(ret, cal(it)); } if (n == 1) return abs(a[1] - b[1]); return ret; } pair<int, int> x[N]; int32_t main() { cin.tie(0)->sync_with_stdio(0); if (fopen("duck.inp", "r")) { freopen("duck.inp", "r", stdin); freopen("duck.out", "w", stdout); } cin >> k >> n; long long answer = 0; for (int i = 1; i <= n; ++i) { char A, B; cin >> A >> x[i].first >> B >> x[i].second; if (A != B) continue; answer += abs(x[i].first - x[i].second); i -= 1; n -= 1; } if (!n) { cout << answer << "\n"; return 0; } if (k == 1) { cout << bridge(vector<pair<int, int>>(x + 1, x + n + 1)) + answer + n << "\n"; return 0; } sort(x + 1, x + n + 1, [&](auto a, auto b) { return a.first + a.second < b.first + b.second; }); long long ret = 1'000'000'000'000'000; for (int i = 1; i <= n; ++i) { vector<pair<int, int>> lt(x + 1, x + i + 1), rt(x + i + 1, x + n + 1); ret = min(ret, bridge(lt) + bridge(rt)); } cout << ret + answer + n << "\n"; }

Compilation message (stderr)

bridge.cpp: In function 'long long int bridge(std::vector<std::pair<int, int> >)':
bridge.cpp:46:19: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   46 |       int mid = l + r >> 1;
      |                 ~~^~~
bridge.cpp: In function 'int32_t main()':
bridge.cpp:62:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   62 |     freopen("duck.inp", "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
bridge.cpp:63:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   63 |     freopen("duck.out", "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#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...