제출 #579104

#제출 시각아이디문제언어결과실행 시간메모리
579104noedit원 고르기 (APIO18_circle_selection)C++17
72 / 100
3093 ms248516 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define MAX 301010
#define INF 1000000010
pair<pair<int, int>, pair<int, int>> in[MAX];
int X[MAX];
int Y[MAX];
int R[MAX];
int ind[MAX];
int ri[MAX];
int ans[MAX];
inline ll sq(ll x)
{
    return x * x;
}
inline bool chk(int i, int j)
{
    return sq(X[i] - X[j]) + sq(Y[i] - Y[j]) <= sq(R[i] + R[j]);
}
bool isrange(int x, int y)
{
    if (x < 0 || y < 0) return false;
    return true;
}
inline ll trans(int x, int y)
{
    return ((ll)x * (ll)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;
signed main()
{
    ios::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, y;
            x = X[i] >>k;
            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] && chk(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]]] << ' ';
}
#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...