Submission #1046401

#TimeUsernameProblemLanguageResultExecution timeMemory
1046401LucaIliePark (BOI16_park)C++17
0 / 100
381 ms27076 KiB
#include <bits/stdc++.h> #define BOTTOM_SIDE n #define RIGHT_SIDE n + 1 #define TOP_SIDE n + 2 #define LEFT_SIDE n + 3 #define BOTTOM_LEFT 0 #define BOTTOM_RIGHT 1 #define TOP_RIGHT 2 #define TOP_LEFT 3 using namespace std; struct point { int x, y; }; int dist( point a, point b ) { return sqrt( (long long)(a.x - b.x) * (a.x - b.x) + (long long)(a.y - b.y) * (a.y - b.y) ); } struct circle { point c; int r; }; struct event { int t, i, j; }; struct query { int e, r; bool ans[4]; }; struct DSU { int n; vector<int> parent; void init( int _n ) { n = _n; parent.resize( n ); for ( int i = 0; i < n; i++ ) parent[i] = i; } int findRoot( int v ) { if ( parent[v] == v ) return v; parent[v] = findRoot( parent[v] ); return parent[v]; } void connect( int u, int v ) { u = findRoot( u ); v = findRoot( v ); parent[u] = v; } bool areConnected( int u, int v ) { return findRoot( u ) == findRoot( v ); } }; const int MAX_N = 2e3; const int MAX_Q = 1e5; const int INF = 1e9; const int UNDEF = -INF; circle trees[MAX_N]; vector<event> events; DSU dsu; int minRadius[4][4]; int main() { int n, q, w, h; cin >> n >> q >> w >> h; for ( int i = 0; i < n; i++ ) cin >> trees[i].c.x >> trees[i].c.y >> trees[i].r; dsu.init( n + 4 ); for ( int i = 0; i < n; i++ ) { for ( int j = i + 1; j < n; j++ ) { int d = (dist( trees[i].c, trees[j].c ) - trees[i].r - trees[j].r) / 2; events.push_back( { d + 1, i, j } ); } } for ( int i = 0; i < n; i++ ) { events.push_back( { (trees[i].c.x - trees[i].r) / 2 + 1, i, LEFT_SIDE } ); events.push_back( { (w - (trees[i].c.x + trees[i].r)) / 2 + 1, i, RIGHT_SIDE } ); events.push_back( { (trees[i].c.y - trees[i].r) / 2 + 1, i, BOTTOM_SIDE } ); events.push_back( { (h - (trees[i].c.y + trees[i].r)) / 2 + 1, i, TOP_SIDE } ); } for ( int e = 0; e < 4; e++ ) { for ( int f = 0; f < 4; f++ ) minRadius[e][f] = UNDEF; } for ( int e = 0; e < 4; e++ ) minRadius[e][e] = INF; sort( events.begin(), events.end(), []( event a, event b ) { return a.t < b.t; } ); for ( event ev: events ) { int r = ev.t; for ( int e = 0; e < 4; e++ ) { bool isClockwisePossible = true; for ( int i = 0; i < 4; i++ ) { int s1 = n + e, s2 = n + i; if ( s1 != s2 ) isClockwisePossible &= (!dsu.areConnected( s1, s2 )); } if ( !isClockwisePossible && minRadius[e][(e + 1) % 4] == UNDEF ) minRadius[e][(e + 1) % 4] = r; bool isDiagPossible = true; for ( int i = 0; i < 2; i++ ) { for ( int j = 2; j < 4; j++ ) { int s1 = n + (e + i) % 4, s2 = n + (e + j) % 4; if ( s1 != s2 ) isDiagPossible &= (!dsu.areConnected( s1, s2 )); } } if ( !isDiagPossible && minRadius[e][(e + 2) % 4] == UNDEF ) minRadius[e][(e + 2) % 4] = r; bool isCounterclockwisePossible = true; for ( int i = 0; i < 4; i++ ) { int s1 = n + (e + 3) % 4, s2 = n + i; if ( s1 != s2 ) isCounterclockwisePossible &= (!dsu.areConnected( s1, s2 )); } if ( !isCounterclockwisePossible && minRadius[e][(e + 3) % 4] == UNDEF ) minRadius[e][(e + 3) % 4] = r; } dsu.connect( ev.i, ev.j ); } for ( int i = 0; i < q; i++ ) { int r, e; cin >> r >> e; e--; for ( int f = 0; f < 4; f++ ) { if ( r < minRadius[e][f] ) cout << f + 1; } cout << "\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...