Submission #123625

#TimeUsernameProblemLanguageResultExecution timeMemory
123625egorlifarPalembang Bridges (APIO15_bridge)C++17
63 / 100
2069 ms19316 KiB
/* ЗАПУСКАЕМ ░ГУСЯ░▄▀▀▀▄░РАБОТЯГУ░░ ▄███▀░◐░░░▌░░░░░░░ ░░░░▌░░░░░▐░░░░░░░ ░░░░▐░░░░░▐░░░░░░░ ░░░░▌░░░░░▐▄▄░░░░░ ░░░░▌░░░░▄▀▒▒▀▀▀▀▄ ░░░▐░░░░▐▒▒▒▒▒▒▒▒▀▀▄ ░░░▐░░░░▐▄▒▒▒▒▒▒▒▒▒▒▀▄ ░░░░▀▄░░░░▀▄▒▒▒▒▒▒▒▒▒▒▀▄ ░░░░░░▀▄▄▄▄▄█▄▄▄▄▄▄▄▄▄▄▄▀▄ ░░░░░░░░░░░▌▌░▌▌░░░░░ ░░░░░░░░░░░▌▌░▌▌░░░░░ ░░░░░░░░░▄▄▌▌▄▌▌░░░░░ */ #include <iostream> #include <complex> #include <vector> #include <string> #include <algorithm> #include <cstdio> #include <numeric> #include <cstring> #include <ctime> #include <cstdlib> #include <set> #include <map> #include <unordered_map> #include <unordered_set> #include <list> #include <cmath> #include <bitset> #include <cassert> #include <queue> #include <stack> #include <deque> using namespace std; template<typename T1, typename T2>inline void chkmin(T1 &x, T2 y) { if (x > y) x = y; } template<typename T1, typename T2>inline void chkmax(T1 &x, T2 y) { if (x < y) x = y; } #define sz(c) (int)(c).size() #define all(c) (c).begin(), (c).end() #define rall(c) (c).rbegin(), (c).rend() #define left left228 #define right right228 #define next next228 #define rank rank228 #define prev prev228 #define y1 y1228 #define read(FILENAME) freopen((FILENAME + ".in").c_str(), "r", stdin) #define write(FILENAME) freopen((FILENAME + ".out").c_str(), "w", stdout) #define files(FILENAME) read(FILENAME), write(FILENAME) #define pb push_back const string FILENAME = "input"; const int MAXN = 200228; int n, k; int l[MAXN], r[MAXN]; vector<int> fb[MAXN]; vector<int> fe[MAXN]; long long score[MAXN]; vector<int> vx; long long getres(int i, int j) { long long add = 0; for (int k = 0; k < n; k++) { if (l[k] <= i && i <= r[k]) { continue; } if (l[k] <= j && j <= r[k]) { continue; } add += min(min(abs(vx[l[k]] - vx[i]), abs(vx[r[k]] - vx[i])), min(abs(vx[l[k]] - vx[j]), abs(vx[r[k]] - vx[j]))); } return add; } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); //read(FILENAME); cin >> k >> n; long long ans = 0; int uk = 0; for (int i = 0; i < n; i++) { char c, c1; int x, x1; cin >> c >> x >> c1 >> x1; if (c == c1) { ans += abs(x1 - x); continue; } if (x > x1) { swap(x, x1); } ans += x1 - x + 1; l[uk] = x; r[uk] = x1; uk++; } n = uk; for (int i = 0; i < n; i++) { vx.pb(l[i]); vx.pb(r[i]); } vx.pb(0); sort(all(vx)); vx.resize(distance(vx.begin(), unique(all(vx)))); for (int i = 0; i < n; i++) { l[i] = lower_bound(all(vx), l[i]) - vx.begin(); r[i] = lower_bound(all(vx), r[i]) - vx.begin(); } if (k == 1) { for (int i = 0; i < n; i++) { fb[l[i]].pb(i); fe[r[i]].pb(i); //cout << l[i] << ' ' << r[i] << endl; } long long sum = 0; int cnt = 0; for (int i = 0; i < sz(vx); i++) { for (auto x: fe[i]) { sum += vx[r[x]]; cnt++; } score[i] += 1LL * vx[i] * cnt - sum; } cnt = 0; sum = 0; long long add = 2e18; for (int i = sz(vx) - 1; i >= 0; i--) { for (auto x: fb[i]) { sum += vx[l[x]]; cnt++; } score[i] += -1LL * vx[i] * cnt + sum; chkmin(add, score[i]); } //cout << add << endl; cout << ans + 2 * add << '\n'; return 0; } uk = 0; long long add = 2e18; for (int i = 0; i < sz(vx); i++) { chkmax(uk, i); while (uk + 1 < sz(vx) && getres(i, uk) >= getres(i, uk + 1)) { uk++; } chkmin(add, getres(i, uk)); } cout << ans + 2 * add << '\n'; 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...