Submission #456178

#TimeUsernameProblemLanguageResultExecution timeMemory
456178prvocisloCircle selection (APIO18_circle_selection)C++17
87 / 100
3059 ms12472 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
typedef long long ll;
using namespace std;

const int maxn = 3e5 + 5, logn = 30;
const ll maxi = 1e9 + 5;
struct circle { int x, y, r; };
vector<circle> c(maxn);
bool in(const int& a, const int& b)
{
    return (c[a].r + c[b].r) * 1ll * (c[a].r + c[b].r)
        >= (c[a].x - c[b].x) * 1ll * (c[a].x - c[b].x) + (c[a].y - c[b].y) * 1ll * (c[a].y - c[b].y);
}
bool cmp(const int& a, const int& b)
{
    return (c[a].r == c[b].r ? a < b : c[a].r > c[b].r);
}
vector<pair<pair<int, int>, int> > o;
vector<int> ans(maxn, -1), ord(maxn, -1);
int n, r;
inline void process(const int& i)
{
    for (int l = -2; l <= 2; l++)
    {
        int x = (c[i].x >> r) + l;
        int y1 = max(-maxi, (((ll)c[i].y) >> ((ll)r)) - (1ll << ((ll)(r + 1))));
        int y2 = min(maxi, (((ll)c[i].y) >> ((ll)r)) + (1ll << ((ll)(r + 1))));
        auto it = lower_bound(o.begin(), o.end(), make_pair(make_pair(x, y1), -1));
        while (it != o.end() && it->first <= make_pair(x, y2))
        {
            if (ans[it->second] == -1 && in(it->second, i)) ans[it->second] = i;
            it++;
        }
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> c[i].x >> c[i].y >> c[i].r;
        ord[i] = i;
    }
    sort(ord.begin(), ord.begin() + n, cmp);
    int id = 0;
    for (r = logn; r >= 0; r--)
    {
        o.clear();
        for (int i = 0; i < n; i++) if (ans[i] == -1)
            o.push_back({ {c[i].x >> r, c[i].y >> r}, i });
        sort(o.begin(), o.end());
        while (id != n && (!r || c[ord[id]].r >= (1 << (r - 1))))
        {
            if (ans[ord[id]] == -1) process(ord[id]);
            id++;
        }
    }
    for (int i = 0; i < n; i++) cout << ans[i] + 1 << " ";
    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...