제출 #579090

#제출 시각아이디문제언어결과실행 시간메모리
579090noedit원 고르기 (APIO18_circle_selection)C++17
37 / 100
3087 ms133908 KiB
#include <bits/stdc++.h> #define sz(x) (x.size()) using namespace std; 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; } inline 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; } 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); 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; } int xx, yy; for (xx = x - 1; xx <= x + 1; xx++) { for (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; int xx, yy; for (xx = x - 1; xx <= x + 1; xx++) { for (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; }

컴파일 시 표준 에러 (stderr) 메시지

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