Submission #579069

#TimeUsernameProblemLanguageResultExecution timeMemory
579069noeditCircle selection (APIO18_circle_selection)C++17
37 / 100
3089 ms133992 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> //#pragma GCC optimize("Ofast") //#pragma GCC optimize("O0") //#pragma GCC optimize("Ofast") //#pragma GCC optimize("unroll-loops") //#pragma GCC target("avx,avx2,fma") #define sz(x) (x.size()) using namespace std; //using namespace __gnu_pbds; // //template <class T> //using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; typedef long long ll; //#define int long long #define INF 1000000010 #define MAXN 300000 pair<pair<int, int>, pair<int, int> > in[MAXN]; int X[MAXN], Y[MAXN], R[MAXN]; int ind[MAXN]; int ans[MAXN]; int ri[MAXN]; inline ll sq(ll x) { return x * x; } bool check(int i, int j) { return sq(X[i] - X[j]) + sq(Y[i] - Y[j]) <= sq(R[i] + R[j]); } inline bool isrange(int x, int y) { if (x < 0 || y < 0) return false; return true; } ll trans(int x, int y) { return ((ll)x * 1ll * INF) + y; } bool cmp(pair<pair<int, int>, pair<int, int> >& p1, pair<pair<int, int>, pair<int, int> >& p2) { if (p1.first.first == p2.first.first) { return p1.first.second < p2.first.second; } else { return p1.first.first > p2.first.first; } } unordered_map<ll, vector<int> > mp; void solve() { } signed main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n; cin >> n; int i; for (i = 1; i <= n; i++) { cin >> in[i].second.first >> in[i].second.second >> in[i].first.first; in[i].first.second = i; } sort(in + 1, in + n + 1, cmp); for (i = 1; i <= n; i++) { tie(X[i], Y[i], R[i], ind[i]) = make_tuple(in[i].second.first + INF, in[i].second.second + INF, in[i].first.first, in[i].first.second); } int k; int s, e; e = 0; for (k = 30; k >= 0; k--) { int r = (1 << k); s = e + 1; if (R[s] < r / 2) { continue; } mp.clear(); e = 0; for (i = s; i <= n; i++) { if (ans[i]) { continue; } int x, y; x = X[i] >> k; y = Y[i] >> k; if (R[i] < r / 2 && !e) { e = i - 1; } for (int xx = x - 1; xx <= x + 1; xx++) { for (int yy = y - 1; yy <= y + 1; yy++) { mp[(ll)xx << 31LL + yy].push_back(i); } } } if (e == 0) { e = n; } for (i = s; i <= e; i++) { if (ans[i]) { continue; } ans[i] = i; int x = X[i] >> k; int y = Y[i] >> k; for (int xx = x - 1; xx <= x + 1; xx++) { for (int yy = y - 1; yy <= y + 1; yy++) { ll t = ((ll)xx << 31LL + yy); for (auto& c : mp[t]) { if (!ans[c] && check(c, i)) { ans[c] = i; } } } } } } for (i = 1; i <= n; i++) { ri[ind[i]] = i; } for (i = 1; i <= n; i++) { cout << ind[ans[ri[i]]] << ' '; } return 0; }

Compilation message (stderr)

circle_selection.cpp: In function 'int main()':
circle_selection.cpp:116:39: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
  116 |                     mp[(ll)xx << 31LL + yy].push_back(i);
      |                                  ~~~~~^~~~
circle_selection.cpp:137:44: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
  137 |                     ll t = ((ll)xx << 31LL + yy);
      |                                       ~~~~~^~~~
#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...