Submission #864647

#TimeUsernameProblemLanguageResultExecution timeMemory
864647danikoynov원 고르기 (APIO18_circle_selection)C++14
0 / 100
1188 ms53940 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; struct point { ll x, y; }; struct circle { point centre; ll radius; }; const int maxn = 3e5 + 10; int n; circle c[maxn]; void input() { cin >> n; for (int i = 1; i <= n; i ++) cin >> c[i].centre.x >> c[i].centre.y >> c[i].radius; } int used[maxn], par[maxn]; int find_biggest() { int idx = -1; for (int i = 1; i <= n; i ++) { if (used[i]) continue; if (idx == -1 || c[i].radius > c[idx].radius) idx = i; } return idx; } ll distance(point A, point B) { ll dx = (A.x - B.x); ll dy = (A.y - B.y); return dx * dx + dy * dy; } void simulate() { while(true) { int idx = find_biggest(); if (idx == -1) break; ///cout << "current " << idx << endl; for (int i = 1; i <= n; i ++) { if (used[i] == 1) continue; if (distance(c[idx].centre, c[i].centre) <= (c[idx].radius + c[i].radius) * (c[idx].radius + c[i].radius)) used[i] = 1, par[i] = idx; } } } void print() { for (int i = 1; i <= n; i ++) cout << par[i] << " "; cout << endl; } void solve_subtask_2() { set < pair < int, int > > lf, rf; set < pair < int, int > > act; for (int i = 1; i <= n; i ++) { lf.insert(make_pair(c[i].centre.x - c[i].radius, i)); rf.insert(make_pair(c[i].centre.x + c[i].radius, i)); act.insert(make_pair(c[i].radius, i)); } int last = n + 1; while(!act.empty()) { int idx = act.begin() -> second; int left = c[idx].centre.x - c[idx].radius; int right = c[idx].centre.x + c[idx].radius; while(true) { set < pair < int, int > > :: iterator it = lf.lower_bound({left, -1}); if (it == lf.end()) break; if (it -> first <= right) { int i = it -> second; par[i] = idx; lf.erase(make_pair(c[i].centre.x - c[i].radius, i)); rf.erase(make_pair(c[i].centre.x + c[i].radius, i)); act.erase(make_pair(c[i].radius, i)); } else { break; } } while(true) { set < pair < int, int > > :: iterator it = rf.upper_bound({right, -1}); if (it == rf.begin()) break; it = prev(it); if (it -> first >= left) { int i = it -> second; par[i] = idx; lf.erase(make_pair(c[i].centre.x - c[i].radius, i)); rf.erase(make_pair(c[i].centre.x + c[i].radius, i)); act.erase(make_pair(c[i].radius, i)); } else { break; } } } } void solve() { input(); bool all_on_x = true; for (int i = 1; i <= n; i ++) { if (c[i].centre.y != 0) all_on_x = false; } if (all_on_x) solve_subtask_2(); /**else simulate();*/ print(); } int main() { solve(); return 0; } /** 11 9 9 2 13 2 1 11 8 2 3 3 2 3 12 1 12 14 1 9 8 5 2 8 2 5 2 1 14 4 2 14 14 1 11 9 0 2 13 0 1 11 0 2 3 0 2 3 0 1 12 0 1 9 0 5 2 0 2 5 0 1 14 0 2 14 0 1 */

Compilation message (stderr)

circle_selection.cpp: In function 'void solve_subtask_2()':
circle_selection.cpp:94:9: warning: unused variable 'last' [-Wunused-variable]
   94 |     int last = n + 1;
      |         ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...