Submission #578433

#TimeUsernameProblemLanguageResultExecution timeMemory
578433Shreyan_PaliwalPark (BOI16_park)C++17
100 / 100
857 ms65040 KiB
#include <bits/stdc++.h> using namespace std; const long long MAXN = 2005; const long long INF = 2000000000; long long n, m; long long w, h; pair<long long,long long> coords[MAXN]; long long radii[MAXN]; double distances[MAXN][MAXN]; vector<pair<long long,long long>> dist_sorted; double wallsconnected[4][4]; long long root[MAXN], depth[MAXN]; long long find(long long k) { if (k == root[k]) return k; return root[k] = find(root[k]); } bool same(long long a, long long b) {return find(a) == find(b); } void unite(long long a, long long b) { a = find(a), b = find(b); if (a == b) return; if (depth[a] < depth[b]) root[a]=b; else root[b]=a, depth[a] += (depth[a]==depth[b]); } long long sq(long long x) {return x*x;} double dist(long long a, long long b) { return sqrt(sq(coords[a].first - coords[b].first) + sq(coords[a].second - coords[b].second)) - radii[a] - radii[b]; } int main() { cin >> n >> m; cin >> w >> h; for (long long i = 0; i < n; i++) cin >> coords[i].first >> coords[i].second >> radii[i]; for (long long i = 0; i < n; i++) for (long long j = i + 1; j < n; j++) distances[j][i] = distances[i][j] = dist(i, j); for (long long i = 0; i < n; i++) distances[n+3][i] = distances[i][n+3] = h - coords[i].second - radii[i]; for (long long i = 0; i < n; i++) distances[n+2][i] = distances[i][n+2] = w - coords[i].first - radii[i]; for (long long i = 0; i < n; i++) distances[n+1][i] = distances[i][n+1] = coords[i].second - radii[i]; for (long long i = 0; i < n; i++) distances[n][i] = distances[i][n] = coords[i].first - radii[i]; for (long long i = 0; i < n; i++) for (long long j = i+1; j < n+4; j++) dist_sorted.push_back({i, j}); sort(dist_sorted.begin(), dist_sorted.end(), [](pair<long long,long long> a, pair<long long,long long> b) { return distances[a.first][a.second] < distances[b.first][b.second]; }); for (long long i = 0; i < 4; i++) for (long long j = 0; j < 4; j++) wallsconnected[i][j] = INF; for (long long i = 0; i < MAXN; i++) root[i]=i; for (long long i = 0; i < MAXN; i++) depth[i]=1; for (auto i : dist_sorted) { unite(i.first, i.second); //cout << i.first << " " << i.second << " " << distances[i.first][i.second] << '\n'; for (long long j = 0; j < 4; j++) { for (long long k = 0; k < 4; k++) { if (j == k) continue; if (wallsconnected[j][k] == INF && same(n + j, n + k)) { wallsconnected[j][k] = distances[i.first][i.second]; //cout << j << " " << k << '\n'; } } } } for(long long i = 0; i < 4; i++) for(long long j = 0; j < 4; j++){ //cout << wallsconnected[i][j] << (j < 3 ? ' ' : '\n'); } for (long long i = 0; i < m; i++) { double r; long long e; cin >> r >> e; e--; for(long long j = 0; j < 4; j++) { bool works = 1; if(j != e){ works &= wallsconnected[e][(e + 1) % 4] >= 2*r; //cout << wallsconnected[e][(e+1)%4] << " "; works &= wallsconnected[j][(j + 1) % 4] >= 2*r; //cout << wallsconnected[j][(j+1)%4] << " "; if((4 + j - e) % 4 >= 2){ works &= wallsconnected[e][(e + 2) % 4] >= 2*r; } if((4 + j - e) % 4 <= 2){ works &= wallsconnected[(e + 1) % 4][(e + 3) % 4] >= 2*r; } } if(works) cout << char('1' + j); //cout << endl; } cout << '\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...