Submission #864643

#TimeUsernameProblemLanguageResultExecution timeMemory
864643danikoynovCircle selection (APIO18_circle_selection)C++14
0 / 100
856 ms104832 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()) { assert(act.size() != last); 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 -> 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.lower_bound({left, -1}); 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; } } last = act.size(); } } 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 */

Compilation message (stderr)

In file included from /usr/include/c++/10/cassert:44,
                 from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:33,
                 from circle_selection.cpp:1:
circle_selection.cpp: In function 'void solve_subtask_2()':
circle_selection.cpp:97:27: warning: comparison of integer expressions of different signedness: 'std::set<std::pair<int, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   97 |         assert(act.size() != last);
      |                ~~~~~~~~~~~^~~~~~~
#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...