제출 #163174

#제출 시각아이디문제언어결과실행 시간메모리
163174combi1k1원 고르기 (APIO18_circle_selection)C++14
100 / 100
1456 ms43864 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define sz(x) x.size() const int N = 3e5 + 1; const int inf = 1e9 + 7; typedef vector<int> vi; struct Circle { int x, y; int R, i; int ans; } C[N]; bool Share(Circle a,Circle b) { long long dX = 1ll * (a.x - b.x) * (a.x - b.x); long long dY = 1ll * (a.y - b.y) * (a.y - b.y); long long dR = 1ll * (a.R + b.R) * (a.R + b.R); return dX + dY <= dR; } ll encode(int x,int y) { return ((ll)x << 31) + y; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin >> n; for(int i = 0 ; i < n ; ++i) { cin >> C[i].x; C[i].x += inf; cin >> C[i].y; C[i].y += inf; cin >> C[i].R; C[i].i = i; C[i].ans = -1; } sort(C,C + n,[&](Circle C1,Circle C2) { if (C1.R != C2.R) return C1.R > C2.R; if (C1.R == C2.R) return C1.i < C2.i; }); int unit = 2e9 + 1; unordered_map<ll,vi> Combi; auto build = [&]() { Combi.clear(); for(int i = 0 ; i < n ; ++i) if (C[i].ans < 0) { int x = C[i].x / unit; int y = C[i].y / unit; Combi[encode(x,y)].pb(i); } }; for(int i = 0 ; i < n ; ++i) if (C[i].ans < 0) { //cout << C[i].i << " "; if (unit > C[i].R * 2) { unit = C[i].R; build(); } int x = C[i].x / unit; int y = C[i].y / unit; for(int a = x - 2 ; a < x + 3 ; ++a) for(int b = y - 2 ; b < y + 3 ; ++b) { ll Hash = encode(a,b); if(!Combi.count(Hash)) continue; vi &v = Combi[Hash]; for(int j = 0 ; j < v.size() ; ++j) if (Share(C[i],C[v[j]])) { C[v[j]].ans = C[i].i; swap(v[j],v.back()); v.pop_back(); j--; } } } sort(C,C + n,[&](Circle C1,Circle C2) { return C1.i < C2.i; }); for(int i = 0 ; i < n ; ++i) cout << C[i].ans + 1 << " "; } /* 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 */

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

circle_selection.cpp: In function 'int main()':
circle_selection.cpp:80:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for(int j = 0 ; j < v.size() ; ++j) if (Share(C[i],C[v[j]]))    {
                             ~~^~~~~~~~~~
circle_selection.cpp: In lambda function:
circle_selection.cpp:47:5: warning: control reaches end of non-void function [-Wreturn-type]
     });
     ^
#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...