Submission #348336

#TimeUsernameProblemLanguageResultExecution timeMemory
348336denkendoemeerCircle selection (APIO18_circle_selection)C++14
100 / 100
1476 ms27352 KiB
#include<bits/stdc++.h>
using namespace std;
struct cerc
{
    int x,y,r,id;
    bool operator < (const cerc &a) const
    {
        return make_pair(x,y)<make_pair(a.x,a.y);
    }
}v[300005],orig[300005];
const int nr=1e9+100;
int ans[300005];
bool inter(cerc a,cerc b)
{
    int dx=a.x-b.x,dy=a.y-b.y,dr=a.r+b.r;
    if (1LL*dx*dx+1LL*dy*dy<=1LL*dr*dr)
        return 1;
    return 0;
}
int cmp(const cerc &a,const cerc &b)
{
    return make_pair(-a.r,a.id)<make_pair(-b.r,b.id);
}
vector<cerc>aux;
int main()
{
    //freopen(".in","r",stdin);
    //freopen(".out","w",stdout);
    int n,i,off,j;
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%d%d%d",&v[i].x,&v[i].y,&v[i].r);
        v[i].x+=nr;
        v[i].y+=nr;
        v[i].id=i+1;
        orig[i+1]=v[i];
    }
    sort(v,v+n,cmp);
    for(i=30;i>=1;i--){
        int st,dr;
        st=1<<(i-1);
        dr=(1<<i)-1;
        aux.clear();
        for(j=0;j<n;j++)
            if (ans[v[j].id]==0 && v[j].r<=dr)
                aux.push_back({v[j].x>>i,v[j].y>>i,v[j].r,v[j].id});
        sort(aux.begin(),aux.end());
        for(j=0;j<n;j++)
            if (ans[v[j].id]==0 && v[j].r>=st && v[j].r<=dr){
                for(off=-2;off<=2;off++){
                    int auxx=(v[j].x>>i)+off,auxy=(v[j].y>>i)-2;
                    auto it=lower_bound(aux.begin(),aux.end(),(cerc){auxx,auxy,-1,-1})-aux.begin();
                    while(it<aux.size() && make_pair(aux[it].x,aux[it].y)<=make_pair(auxx,auxy+4)){
                        if (inter(orig[aux[it].id],v[j]) && ans[aux[it].id]==0)
                            ans[aux[it].id]=v[j].id;
                        it++;
                    }
                }
            }
    }
    for(i=1;i<=n;i++)
        printf("%d ",ans[i]);
return 0;
}

Compilation message (stderr)

circle_selection.cpp: In function 'int main()':
circle_selection.cpp:53:29: warning: comparison of integer expressions of different signedness: 'long int' and 'std::vector<cerc>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   53 |                     while(it<aux.size() && make_pair(aux[it].x,aux[it].y)<=make_pair(auxx,auxy+4)){
      |                           ~~^~~~~~~~~~~
circle_selection.cpp:30:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   30 |     scanf("%d",&n);
      |     ~~~~~^~~~~~~~~
circle_selection.cpp:32:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   32 |         scanf("%d%d%d",&v[i].x,&v[i].y,&v[i].r);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...