Submission #453749

#TimeUsernameProblemLanguageResultExecution timeMemory
453749arminatarodCircle selection (APIO18_circle_selection)C++17
15 / 100
2473 ms159236 KiB
#include <bits/stdc++.h> using namespace std; constexpr int MAXN = 300005; constexpr int MAXINT = 1073741823; vector<int> all_numbers; vector<int> neighbors[MAXN]; struct circles { long long int x, y, radius; } circle[MAXN]; int sorted[MAXN], answer[MAXN]; bitset<MAXN> deleted; bool comparison(int x, int y) { return (circle[x].radius == circle[y].radius? x < y : circle[x].radius > circle[y].radius); } map<int, vector<pair<int, int>>> to_add, to_delete; set<pair<int, int>> s; set<pair<int, int>>::iterator it; bool check(circles u, circles v) { long long int distance_2 = (u.x - v.x) * (u.x - v.x) + (u.y - v.y) * (u.y - v.y); long long int radius_2 = (u.radius + v.radius) * (u.radius + v.radius); return (radius_2 >= distance_2); } int main() { ios::sync_with_stdio(false); cin.tie(0); long long int n, distance_2, radius_2; cin >> n; for (int i = 0; i < n; i++) { cin >> circle[i].x >> circle[i].y >> circle[i].radius; all_numbers.push_back(circle[i].y - circle[i].radius); all_numbers.push_back(circle[i].y + circle[i].radius); to_add[circle[i].y - circle[i].radius].emplace_back(circle[i].x, i); to_delete[circle[i].y + circle[i].radius].emplace_back(circle[i].x, i); sorted[i] = i; } sort(sorted, sorted + n, comparison); sort(all_numbers.begin(), all_numbers.end()); all_numbers.resize(distance(all_numbers.begin(), unique(all_numbers.begin(), all_numbers.end()))); for (int i : all_numbers) { for (pair<int, int> j : to_add[i]) { s.insert(j); it = s.lower_bound(j); if (it != s.begin()) { it--; if (check(circle[it->second], circle[j.second])) { neighbors[it->second].push_back(j.second); neighbors[j.second].push_back(it->second); } it++; } if (*it != *s.rbegin()) { it++; if (check(circle[it->second], circle[j.second])) { neighbors[it->second].push_back(j.second); neighbors[j.second].push_back(it->second); } it--; } } for (pair<int, int> j : to_delete[i]) { it = s.lower_bound(j); if (it != s.begin()) { it--; if (check(circle[it->second], circle[j.second])) { neighbors[it->second].push_back(j.second); neighbors[j.second].push_back(it->second); } it++; } if (*it != *s.rbegin()) { it++; if (check(circle[it->second], circle[j.second])) { neighbors[it->second].push_back(j.second); neighbors[j.second].push_back(it->second); } it--; } s.erase(j); } } for (int i = 0; i < n; i++) if (!deleted[sorted[i]]) { answer[sorted[i]] = sorted[i]; deleted[sorted[i]] = true; for (int j : neighbors[sorted[i]]) { if (deleted[j]) continue; answer[j] = sorted[i]; deleted[j] = true; } } for (int i = 0; i < n; i++) cout << answer[i] + 1 << ' '; return 0; }

Compilation message (stderr)

circle_selection.cpp: In function 'int main()':
circle_selection.cpp:40:19: warning: unused variable 'distance_2' [-Wunused-variable]
   40 |  long long int n, distance_2, radius_2;
      |                   ^~~~~~~~~~
circle_selection.cpp:40:31: warning: unused variable 'radius_2' [-Wunused-variable]
   40 |  long long int n, distance_2, radius_2;
      |                               ^~~~~~~~
#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...