From adb912f94214aba109f897d7fb4f09aab239955d Mon Sep 17 00:00:00 2001 From: tiennm99 Date: Sat, 29 Nov 2025 00:58:51 +0700 Subject: [PATCH] feat(cpp): add prevoi19_robots (wip) --- cpp/prevoi19_robots.cpp | 111 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 cpp/prevoi19_robots.cpp diff --git a/cpp/prevoi19_robots.cpp b/cpp/prevoi19_robots.cpp new file mode 100644 index 0000000..c26ad4d --- /dev/null +++ b/cpp/prevoi19_robots.cpp @@ -0,0 +1,111 @@ +#include +#include +#include +using namespace std; + +typedef long long ll; + +struct Point { + ll x, y; + + Point(ll x = 0, ll y = 0) : x(x), y(y) { + } +}; + +ll manhattan(const Point &a, const Point &b) { + return abs(a.x - b.x) + abs(a.y - b.y); +} + +bool isPossible(ll D, const vector &chargers, const Point &start, ll N) { + ll u0 = start.x + start.y; + ll v0 = start.x - start.y; + ll min_u = u0 - N; + ll max_u = u0 + N; + ll min_v = v0 - N; + ll max_v = v0 + N; + + vector test_points; + + vector u_candidates = {min_u, max_u}; + vector v_candidates = {min_v, max_v}; + + for (const Point &c: chargers) { + ll cu = c.x + c.y; + ll cv = c.x - c.y; + + u_candidates.push_back(cu - D); + u_candidates.push_back(cu + D); + v_candidates.push_back(cv - D); + v_candidates.push_back(cv + D); + } + + u_candidates.push_back(u0); + v_candidates.push_back(v0); + + for (ll u: u_candidates) { + for (ll v: v_candidates) { + if ((u + v) % 2 == 0) { + ll x = (u + v) / 2; + ll y = (u - v) / 2; + test_points.push_back(Point(x, y)); + } else { + ll x1 = (u + v) / 2; + ll y1 = (u - v) / 2; + test_points.push_back(Point(x1, y1)); + + ll x2 = (u + v + 1) / 2; + ll y2 = (u - v - 1) / 2; + test_points.push_back(Point(x2, y2)); + } + } + } + + for (const Point &p: test_points) { + if (manhattan(p, start) > N) continue; + + bool valid = true; + for (const Point &c: chargers) { + if (manhattan(p, c) < D) { + valid = false; + break; + } + } + if (valid) return true; + } + + return false; +} + +int main() { + ios_base::sync_with_stdio(false); + cin.tie(NULL); + + int U; + ll N; + cin >> U >> N; + + vector chargers(U); + for (int i = 0; i < U; i++) { + cin >> chargers[i].x >> chargers[i].y; + } + + Point start; + cin >> start.x >> start.y; + + ll left = 0; + ll right = 4e9; + + while (left <= right) { + ll mid = left + (right - left) / 2; + + if (isPossible(mid, chargers, start, N)) { + left = mid + 1; + } else { + right = mid - 1; + } + } + + cout << right << endl; + + return 0; +}