Submission #1301772

#TimeUsernameProblemLanguageResultExecution timeMemory
1301772sasdePark (BOI16_park)C++20
0 / 100
217 ms28356 KiB
#include <bits/stdc++.h> #define fi first #define se second #define nmax 100008 using namespace std; typedef pair<int, int> pii; struct pot { int x, y, r; }; int n, m, w, h; string ans[nmax]; pot a[2008]; vector<pair<int, pii> > edges, queries; void make_edges() { for (int i = 1; i <= n; i++) { for (int j = i + 1; j <= n; j++) { int dx = a[i].x - a[j].x; int dy = a[i].y - a[j].y; long long dist_sq = (long long)dx * dx + (long long)dy * dy; int r_sum = a[i].r + a[j].r; int w = sqrtl(dist_sq) - r_sum; if (w < 0) { w = 0; } edges.push_back({w, {i, j}}); } edges.push_back({max(0, a[i].x - a[i].r), {n + 4, i}}); edges.push_back({max(0, h - a[i].y - a[i].r), {n + 3, i}}); edges.push_back({max(0, w - a[i].x - a[i].r), {n + 2, i}}); edges.push_back({max(0, a[i].y - a[i].r), {n + 1, i}}); } sort(edges.begin(), edges.end()); } struct dsu { int par[nmax]; void init(int n) { for (int i = 1; i <= n; i++) { par[i] = -1; } } int root(int x) { return par[x] < 0 ? x : par[x] = root(par[x]); } bool join(int u, int v) { if ((u = root(u)) == (v = root(v))) { return false; } if (par[u] > par[v]) { swap(u, v); } par[u] += par[v]; par[v] = u; return true; } bool check(int u, int v) { return root(u) == root(v); } }dsu; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m >> w >> h; for (int i = 1; i <= n; i++) { cin >> a[i].x >> a[i].y >> a[i].r; } for (int i = 1; i <= m; i++) { int r, c; cin >> r >> c; queries.push_back({r, {c, i}}); } sort(queries.begin(), queries.end()); make_edges(); dsu.init(n + 4); int idx = 0; for (pair<int, pii> query : queries) { int limit = query.fi * 2; int c = query.se.fi; int id = query.se.se; while (idx < (int)edges.size() && edges[idx].fi < limit) { dsu.join(edges[idx].se.fi, edges[idx].se.se); idx++; } string res = ""; switch (c) { case 1: if (dsu.check(n + 1, n + 4)) { res = "1"; } else { res = "1"; if (!dsu.check(n + 1, n + 3)) { res.push_back('2'); } if (!dsu.check(n + 1, n + 3) and !dsu.check(n + 2, n + 4)) { res.push_back('3'); } if (!dsu.check(n + 2, n + 4)) { res.push_back('4'); } } break; case 2: if (dsu.check(n + 1, n + 2)) { res = "2"; } else { if (!dsu.check(n + 1, n + 3)) { res.push_back('1'); } res.push_back('2'); if (!dsu.check(n + 2, n + 4)) { res.push_back('3'); } if (!dsu.check(n + 2, n + 4) and !dsu.check(n + 1, n + 3)) { res.push_back('4'); } } break; case 3: if (dsu.check(n + 2, n + 3)) { res = "3"; } else { if (!dsu.check(n + 2, n + 4) and !dsu.check(n + 1, n + 3)) { res.push_back('1'); } if (!dsu.check(n + 2, n + 4)) { res.push_back('2'); } res.push_back('3'); if (!dsu.check(n + 1, n + 3)) { res.push_back('4'); } } break; case 4: if (dsu.check(n + 4, n + 3)) { res = "4"; } else { if (!dsu.check(n + 2, n + 4)) { res.push_back('1'); } if (!dsu.check(n + 2, n + 4) and !dsu.check(n + 1, n + 3)) { res.push_back('2'); } if (!dsu.check(n + 1, n + 3)) { res.push_back('3'); } res.push_back('4'); } break; default: assert(false); } ans[id] = res; } for (int i = 1; i <= m; i++) { cout << ans[i] << '\n'; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...