제출 #970407

#제출 시각아이디문제언어결과실행 시간메모리
970407steveonalex원 고르기 (APIO18_circle_selection)C++17
87 / 100
3060 ms63456 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; #define ALL(v) (v).begin(), (v).end() #define MASK(i) (1LL << (i)) #define GETBIT(mask, i) (((mask) >> (i)) & 1) // mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()); mt19937_64 rng(1); ll rngesus(ll l, ll r){return ((ull) rng()) % (r - l + 1) + l;} ll max(ll a, ll b){return (a > b) ? a : b;} ll min(ll a, ll b){return (a < b) ? a : b;} ll LASTBIT(ll mask){return mask & (-mask);} ll pop_cnt(ll mask){return __builtin_popcountll(mask);} ll ctz(ll mask){return __builtin_ctzll(mask);} ll clz(ll mask){return __builtin_clzll(mask);} ll logOf(ll mask){return 63 - clz(mask);} template <class T1, class T2> bool minimize(T1 &a, T2 b){ if (a > b){a = b; return true;} return false; } template <class T1, class T2> bool maximize(T1 &a, T2 b){ if (a < b){a = b; return true;} return false; } template <class T> void printArr(T& a, string separator = " ", string finish = "\n", ostream& out = cout){ for(auto i: a) out << i << separator; out << finish; } template <class T> void remove_dup(vector<T> &a){ sort(ALL(a)); a.resize(unique(ALL(a)) - a.begin()); } const int N = 3e5 + 69; const ll INF = 1e9; int n; int ans[N]; vector<array<ll, 4>> a; ll sqr(ll x){return x * x;} ll block_sz; map<pair<ll, ll>, vector<int>> grid; pair<ll, ll> dumb_down(pair<ll, ll> a){ return {a.first / block_sz, a.second / block_sz}; } void set_up(ll arg){ block_sz = arg; grid.clear(); for(int i= 1; i<=n; ++i) if (ans[i] == 0){ grid[dumb_down(make_pair(a[i][0], a[i][1]))].push_back(i); } } ll dis(pair<ll, ll> a, pair<ll, ll> b){return sqr(a.first - b.first) + sqr(a.second - b.second);} bool check(pair<ll, ll> point, ll r, pair<ll, ll> des){ if (des.first < 0 || des.second < 0) return false; for(int x = 0; x <= 1; ++x) for(int y = 0; y<=1; ++y){ pair<ll, ll> ligma = {des.first * block_sz, des.second * block_sz}; if (x) ligma.first += block_sz - 1; if (y) ligma.second += block_sz - 1; if ((abs(point.first - ligma.first) + abs(point.second - ligma.second)) * 2 > r * 3) continue; if (dis(point, ligma) <= sqr(r)) return true; } return false; } bool query(int i, int j){ return sqr(a[i][0] - a[j][0]) + sqr(a[i][1] - a[j][1]) <= sqr(a[i][2] + a[j][2]); } int main(void){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n; a.resize(n+1); for(int i = 1; i<=n; ++i) { for(int j = 0; j < 3; ++j) cin >> a[i][j]; a[i][0] += INF; a[i][1] += INF; a[i][3] = i; } vector<array<ll, 4>> b = a; sort(1 + ALL(b), [](array<ll, 4> x, array<ll, 4> y){ if (x[2] != y[2]) return x[2] > y[2]; return x[3] < y[3]; }); set_up((b[1][2] + 1) / 2); for(int i = 1; i<=n; ++i) if (ans[b[i][3]] == 0){ int _i = b[i][3]; ans[_i] = _i; if (b[i][2] < block_sz) set_up((b[i][2] + 1) / 2); pair<ll, ll> cur = make_pair(b[i][0], b[i][1]); pair<ll, ll> magnifico = dumb_down(cur); const int EXTEND = 5; for(int x = -EXTEND; x <= EXTEND; ++x) for(int y = -EXTEND; y<=EXTEND; ++y) { pair<ll, ll> cu = make_pair(magnifico.first + x, magnifico.second + y); // bool bruh = check(cur, b[i][2] * 2, cu); // if (max(abs(x), abs(y)) == EXTEND && bruh) exit(1); if (!grid.count(cu)) continue; for(int j: grid[cu]){ if (ans[j] == 0 && query(_i, j)) ans[j] = _i; } } } for(int i = 1; i<=n; ++i) cout << ans[i] << " "; cout << "\n"; return 0; }
#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...