제출 #772067

#제출 시각아이디문제언어결과실행 시간메모리
772067davitmargCircle selection (APIO18_circle_selection)C++17
37 / 100
3108 ms655996 KiB
/* DavitMarg In pr honky-tonk, Down in Mexico */ #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <algorithm> #include <cmath> #include <vector> #include <string> #include <cstring> #include <map> #include <unordered_map> #include <set> #include <unordered_set> #include <queue> #include <bitset> #include <stack> #include <cassert> #include <iterator> #include <random> #include <chrono> #define mod 1000000007ll #define LL long long #define LD long double #define MP make_pair #define PB push_back #define all(v) v.begin(), v.end() #define fastIO ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); using namespace std; const int N = 500005; #define circle pair<pair<LL, LL>, pair<LL, int>> #define X first.first #define Y first.second #define R second.first #define I second.second int n; circle p[N]; LL rad[N]; map<pair<LL, LL>, vector<circle>> g[35]; int ans[N]; bool intersect(circle a, circle b) { LL dx = a.X - b.X; LL dy = a.Y - b.Y; return (dx * dx) + (dy * dy) <= (a.R + b.R) * (a.R + b.R); } void solve() { cin >> n; for (int i = 1; i <= n; i++) { cin >> p[i].X >> p[i].Y >> p[i].R; p[i].X += mod; p[i].Y += mod; p[i].I = i; rad[0] = max(rad[0], p[i].R); } for (int k = 0; k < 33; k++) { if (rad[k] == 0) break; for (int i = 1; i <= n; i++) g[k][MP(p[i].X / rad[k], p[i].Y / rad[k])].push_back(p[i]); rad[k + 1] = rad[k] / 2; } int cur = 0; sort(p + 1, p + 1 + n, [](circle a, circle b) { if(a.R != b.R) return a.R > b.R; return a.I < b.I; }); for (int i = 1; i <= n; i++) { if (ans[p[i].I]) continue; while (p[i].R * 2 < rad[cur]) cur++; LL x = p[i].X / rad[cur]; LL y = p[i].Y / rad[cur]; for(int kx = x - 2; kx <= x + 2; kx++) for (int ky = y - 2; ky <= y + 2; ky++) { if (g[cur].find(MP(kx, ky)) == g[cur].end()) continue; vector<circle>& c = g[cur][MP(kx, ky)]; for (int j = 0; j < c.size(); j++) { if (ans[c[j].I]) continue; if(intersect(p[i], c[j])) ans[c[j].I] = p[i].I; } } } for (int i = 1; i <= n; i++) cout << ans[i] << " "; cout << endl; } int main() { fastIO; int T = 1; //cin >> T; while (T--) { 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 */

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

circle_selection.cpp: In function 'void solve()':
circle_selection.cpp:101:35: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<std::pair<long long int, long long int>, std::pair<long long int, int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  101 |                 for (int j = 0; j < c.size(); j++)
      |                                 ~~^~~~~~~~~~
#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...