Submission #1155990

#TimeUsernameProblemLanguageResultExecution timeMemory
1155990raphaelpPalembang Bridges (APIO15_bridge)C++20
0 / 100
0 ms328 KiB
#include <bits/stdc++.h> using namespace std; long long solve(long long x, vector<vector<long long>> &Tab, long long K, vector<vector<long long>> &Tab2) { long long tot = 0; vector<long long> dist(Tab.size()), close; for (long long i = 0; i < Tab.size(); i++) { if (x < Tab[i][0]) { close.push_back(Tab[i][1] + Tab[i][0] - x); dist[Tab[i][2]] = (Tab[i][0] - x) * 2; } if (x > Tab2[i][0]) dist[Tab2[i][2]] = (x - Tab2[i][0]) * 2; } sort(close.begin(), close.end()); for (long long i = 0; i < Tab.size(); i++) tot += dist[i]; if (K == 1) return tot; long long minn = tot, buff = 0, buff2 = 0, buff3 = 0, open = 0, last = 0, cur = 0; while (buff < Tab.size() && Tab[buff][0] <= x) buff++; for (; buff < Tab.size(); buff++) { cur = Tab[buff][0]; last = x; if (buff > 0) last = max(last, Tab[buff - 1][0]); while (buff2 < Tab.size() && Tab2[buff2][0] <= cur) { if (Tab2[buff2][1] <= x) { buff2++; continue; } open++; tot -= Tab2[buff2][0] - last; buff2++; } while (buff3 < close.size() && close[buff3] <= cur) { tot += close[buff3] - last; open--; buff3++; } tot -= (cur - last) * (Tab.size() - buff) * 2; tot += open * (cur - last); minn = min(minn, tot); } return minn; } int main() { srand(time(0)); long long K, N; cin >> K >> N; long long tot = 0; vector<vector<long long>> Tab, Tab2; int buff = 0; for (long long i = 0; i < N; i++) { long long b, d; char a, c; cin >> a >> b >> c >> d; tot += abs(b - d); if (a == c) { continue; } Tab.push_back({min(b, d), max(b, d), buff}); Tab2.push_back({max(b, d), min(b, d), buff}); buff++; tot++; } sort(Tab.begin(), Tab.end()); sort(Tab2.begin(), Tab2.end()); long long L = 0, R = Tab.size() - 1; while (L + 2 < R) { long long delta = (R - L) / 3; long long m1 = L + delta, m2 = R - delta; if (solve(Tab[m1][0], Tab, K, Tab2) < solve(Tab[m2][0], Tab, K, Tab2)) R = m2; else L = m1; } long long minn = 123456789123456789; for (long long i = L; i <= R; i++) minn = min(minn, solve(Tab[i][0], Tab, K, Tab2)); cout << tot + minn; }
#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...