Submission #1096360

#TimeUsernameProblemLanguageResultExecution timeMemory
1096360anhthiPark (BOI16_park)C++14
0 / 100
265 ms65544 KiB
#include <bits/stdc++.h> using namespace std; #define fi first #define se second #define ll long long #define mp(x, y) make_pair(x, y) #define sz(v) ((int) (v).size()) #define all(v) (v).begin(), (v).end() #define MASK(i) (1LL << (i)) #define BIT(x, y) (((x) >> (y)) & 1) #define pb push_back #define max_rng *max_element #define min_rng *min_element #define rep(i, n) for(int i = 1, _n = (n); i <= _n; ++i) #define forn(i, a, b) for(int i = (a), _b = (b); i <= _b; ++i) #define ford(i, a, b) for(int i = (a), _b = (b); i >= _b; --i) template <class X, class Y> inline bool maximize(X &x, Y y) { return (x < y ? x = y, true : false); } template <class X, class Y> inline bool minimize(X &x, Y y) { return (x > y ? x = y, true : false); } template <class X> inline void compress(vector<X> &a) { sort(all(a)); a.resize(unique(all(a)) - a.begin()); } int ctz(ll x) { return __builtin_ctzll(x); } int lg(ll x) { return 63 - __builtin_clzll(x); } int popcount(ll x) { return __builtin_popcount(x); } mt19937_64 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); ll rand(ll l, ll r) { return l + abs((ll) rng()) % (r - l + 1); } const ll oo = (ll) 1e17; const int inf = (ll) 2e9 + 7, mod = (ll) 123456789; const int N = 5e5 + 5, BASE = 307; void add(int &x, int y) { x += y; if (x >= mod) x -= mod; } void sub(int &x, int y) { x -= y; if (x < 0) x += mod; } ll n, q, w, h; struct Edge { ll u, v; double d; bool operator < (const Edge &e) const { return d < e.d; } }; struct Query { ll e, i; double r; void input(int id) { i = id; cin >> r >> e; r *= 2.0; } bool operator < (const Query &q) const { return r < q.r; } } query[N]; vector<Edge> edges; int x[N], y[N]; double r[N]; double sqr(double x) { return 1LL * x * x; } double dist(int i, int j) { return sqrt(sqr(x[i] - x[j]) + sqr(y[i] - y[j])) - r[i] - r[j]; } struct dsu { vector<ll> par, sz; dsu(ll n) { par.resize(n + 5); sz.resize(n + 5, 1); rep(i, n) par[i] = i; } ll root(ll u) { return u == par[u] ? u : par[u] = root(par[u]); } void unite(ll u, ll v) { u = root(u); v = root(v); if (u == v) return; if (sz[u] < sz[v]) swap(u, v); par[v] = u; sz[u] += sz[v]; return; } bool connect(ll u, ll v) { return root(u) == root(v); } }; string res[N]; signed main(void) { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> q >> w >> h; forn(i, 1, n) { cin >> x[i] >> y[i] >> r[i]; edges.pb({n + 1, i, x[i] - r[i]}); edges.pb({n + 2, i, y[i] - r[i]}); edges.pb({n + 3, i, w - x[i] - r[i]}); edges.pb({n + 4, i, h - y[i] - r[i]}); } forn(i, 1, n) forn(j, i + 1, n) { edges.pb({i, j, dist(i, j)}); } sort(all(edges)); rep(i, q) query[i].input(i); sort(query + 1, query + 1 + q); ll eID = 0; dsu d(n + 5); forn(i, 1, q) { while (eID < sz(edges) && edges[eID].d < query[i].r) { d.unite(edges[eID].u, edges[eID].v); eID++; } string ans; if (query[i].e == 1) { ans = "1"; if (!d.connect(n + 1, n + 4) && !d.connect(n + 2, n + 4) && !d.connect(n + 4, n + 3)) ans += '2'; if (!d.connect(n + 1, n + 4) && !d.connect(n + 1, n + 3) && !d.connect(n + 1, n + 2)) ans += '4'; if (!d.connect(n + 1, n + 4) && !d.connect(n + 2, n + 3) && !d.connect(n + 1, n + 3) && !d.connect(n + 2, n + 4)) ans += '3'; } else if (query[i].e == 2) { ans = "2"; if (!d.connect(n + 1, n + 4) && !d.connect(n + 2, n + 4) && !d.connect(n + 4, n + 3)) ans += '1'; if (!d.connect(n + 3, n + 4) && !d.connect(n + 2, n + 3) && !d.connect(n + 1, n + 3)) ans += '3'; if (!d.connect(n + 1, n + 3) && !d.connect(n + 2, n + 4) && !d.connect(n + 1, n + 2) && !d.connect(n + 3, n + 4)) ans += '4'; } else if (query[i].e == 3) { ans = "3"; if (!d.connect(n + 2, n + 3) && !d.connect(n + 4, n + 3) && !d.connect(n + 1, n + 3)) ans += '2'; if (!d.connect(n + 2, n + 3) && !d.connect(n + 1, n + 2) && !d.connect(n + 4, n + 2)) ans += '4'; if (!d.connect(n + 1, n + 4) && !d.connect(n + 2, n + 3) && !d.connect(n + 1, n + 3) && !d.connect(n + 2, n + 4)) ans += '1'; } else { ans = "4"; if (!d.connect(n + 1, n + 4) && !d.connect(n + 1, n + 3) && !d.connect(n + 1, n + 2)) ans += '1'; if (!d.connect(n + 1, n + 3) && !d.connect(n + 2, n + 4) && !d.connect(n + 1, n + 2) && !d.connect(n + 3, n + 4)) ans += '2'; if (!d.connect(n + 2, n + 3) && !d.connect(n + 1, n + 2) && !d.connect(n + 4, n + 2)) ans += '3'; } res[query[i].i] = ans; } rep(i, q) cout << res[i] << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...