Submission #635908

#TimeUsernameProblemLanguageResultExecution timeMemory
635908MohamedFaresNebiliPark (BOI16_park)C++14
100 / 100
1040 ms33264 KiB
#include <bits/stdc++.h> #pragma GCC optimize ("Ofast") #pragma GCC target ("avx2") using namespace std; using ll = long long; using ld = long double; #define int ll #define ff first #define ss second #define pb push_back #define all(x) (x).begin(), (x).end() #define lb lower_bound int N, M, W, H; int X[2005], Y[20005], R[20005]; int D[2005][2005], res[4][4]; int solve(int state) { int ans = LONG_LONG_MAX; vector<int> dist(N + 1, LONG_LONG_MAX); for(int l = 0; l < N; l++) { dist[l] = min(X[l] - R[l], H - Y[l] - R[l]); if(state == 0) dist[l] = min(dist[l], W - X[l] - R[l]); } vector<bool> vis(N + 1, 0); for(int _ = 0; _ < N; _++) { int cur = -1; for(int l = 0; l < N; l++) { if(!vis[l] && (cur == -1 || dist[l] < dist[cur])) cur = l; } vis[cur] = 1; for(int l = 0; l < N; l++) { if(vis[l]) continue; dist[l] = min(dist[l], max(dist[cur], D[l][cur])); } ans = min(ans, max(dist[cur], Y[cur] - R[cur])); if(state == 1) ans = min(ans, max(W - X[cur] - R[cur], dist[cur])); } return ans; } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> N >> M >> W >> H; for(int l = 0; l < N; l++) cin >> X[l] >> Y[l] >> R[l]; for(int l = 0; l < N; l++) { for(int i = l + 1; i < N; i++) { int lo = 1, hi = 1e9; while(lo <= hi) { int md = (lo + hi) / 2; int dx = (X[l] - X[i]) * (X[l] - X[i]); int dy = (Y[l] - Y[i]) * (Y[l] - Y[i]); int xr = (md + R[l] + R[i]) * (md + R[l] + R[i]); if(xr <= dx + dy) D[l][i] = md, lo = md + 1; else hi = md - 1; } D[i][l] = D[l][i]; } } for(int l = 0, i = 0, j = 1; l < 4; l++, i ^= 2) { res[l][l] = LONG_LONG_MAX; res[i][(i ^ j)] = res[(i ^ j)][i] = solve(0); for(int e = 0; e < N; e++) Y[e] = H - Y[e]; if(l == 0) res[1][3] = res[3][1] = solve(1); if(l == 1) { res[0][2] = res[2][0] = solve(1); swap(H, W); j ^= 2; for(int e = 0; e < N; e++) swap(X[e], Y[e]); } } for(int l = 0; l < M; l++) { int A, B; cin >> A >> B; B--; for(int i = 0; i < 4; i++) if(res[B][i] >= 2 * A) cout << i + 1; cout << "\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...