Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #define pb push_back
- #define f first
- #define sf second.first
- #define ssf second.sf
- #define sss second.second.second
- #define p4l pair<ll, pair<ll, pair<ll, ll> > >
- using namespace std;
- typedef long long ll;
- const int N=1e5+5;
- p4l arr[N];
- ll n, ans[N];
- bool intersect(p4l a, p4l b)
- {
- ll dist=(a.ssf-b.ssf)*(a.ssf-b.ssf)+(a.sss-b.sss)*(a.sss-b.sss);
- ll rad=(a.f+b.f)*(a.f+b.f);
- return dist<=rad;
- }
- int main()
- {
- scanf("%lld", &n);
- for(ll a=1; a<=n; a++)
- {
- scanf("%lld%lld%lld", &arr[a].ssf, &arr[a].sss, &arr[a].f);
- arr[a].sf= -a;
- }
- sort(arr+1, arr+n+1);
- for(ll a=1; a<=n; a++)
- arr[a].sf*=-1;
- ll blocksize=sqrt(n);
- vector<p4l>vec;
- for(ll a=n; a>=1; a--)
- {
- if(ans[arr[a].sf])
- continue;
- bool flag=false;
- for(ll b=0; b<vec.size(); b++)
- if(intersect(vec[b], arr[a]))
- {
- ans[arr[a].sf]=vec[b].sf;
- flag=true;
- break;
- }
- if(flag)
- continue;
- ans[arr[a].sf]=arr[a].sf;
- vec.pb(arr[a]);
- if(vec.size()>=blocksize)
- {
- for(ll b=a-1; b>=1; b--)
- {
- for(ll c=0; c<vec.size(); c++)
- {
- if(ans[arr[b].sf])
- continue;
- if(intersect(vec[c], arr[b]))
- {
- ans[arr[b].sf]=vec[c].sf;
- break;
- }
- }
- }
- vec.clear();
- }
- }
- for(ll a=1; a<=n; a++)
- printf("%lld ", ans[a]);
- printf("\n");
- return 0;
- }
Add Comment
Please, Sign In to add comment