Submission #272468

# Submission time Handle Problem Language Result Execution time Memory
272468 2020-08-18T11:57:36 Z MKopchev Circle selection (APIO18_circle_selection) C++14
7 / 100
3000 ms 245692 KB
#include<bits/stdc++.h>
using namespace std;
const int nmax=3e5+42,inf=1e9+42;

struct circle
{
    int x,y,r,id;
};

int n;
circle inp[nmax],sorted_inp[nmax];

bool touch(circle a,circle b)
{
    long long d=1LL*(a.x-b.x)*(a.x-b.x)+1LL*(a.y-b.y)*(a.y-b.y);

    long long mx=a.r+b.r;

    mx=mx*mx;

    return d<=mx;
}

bool cmp(circle a,circle b)
{
    if(a.r!=b.r)return a.r>b.r;
    return a.id<b.id;
}

int outp[nmax];

set< pair<int/*y*/,int/*id*/> > tree[nmax*4];

void update(int node,int l,int r,int pos,circle cur)
{
    //cout<<node<<" -> "<<cur.y<<" "<<cur.id<<endl;

    tree[node].insert({cur.y,cur.id});

    if(l==r)return;

    int av=(l+r)/2;

    if(pos<=av)update(node*2,l,av,pos,cur);
    else update(node*2+1,av+1,r,pos,cur);
}

int pick(int a,int b)
{
    long long sum=a;
    sum=sum+b;

    if(inf<sum)sum=inf;
    if(-inf>sum)sum=-inf;

    return sum;
}
void match(int node,int l,int r,int lq,int rq,circle cur)
{
    if(tree[node].size()==0)return;

    if(l==lq&&r==rq)
    {
        int y1=pick(cur.y,-2*cur.r);
        int y2=pick(cur.y,2*cur.r);

        //cout<<y1<<" "<<y2<<endl;

        set< pair<int/*y*/,int/*id*/> >::iterator it=tree[node].lower_bound({y1,0});

        vector< pair<int/*y*/,int/*id*/> > to_pop={};

        while(it!=tree[node].end())
        {
            pair<int/*y*/,int/*id*/> info=*it;

            if(info.first>y2)break;

            if(outp[info.second]==0)
            {
                if(touch(inp[info.second],cur))
                {
                    //cout<<"touch "<<info.second<<" "<<cur.id<<" "<<endl;

                    outp[info.second]=cur.id;
                }
            }

            if(outp[info.second])to_pop.push_back(info);

            it++;
        }

        for(auto k:to_pop)
            tree[node].erase(k);
    }

    int av=(l+r)/2;

    if(lq<=av)match(node*2,l,av,lq,min(av,rq),cur);
    if(av<rq)match(node*2+1,av+1,r,max(av+1,lq),rq,cur);
}

int help_x[nmax];

void push(int which)
{
    outp[sorted_inp[which].id]=sorted_inp[which].id;

    int x1=pick(sorted_inp[which].x,-2*sorted_inp[which].r);
    int x2=pick(sorted_inp[which].x,+2*sorted_inp[which].r);

    int le=lower_bound(help_x+1,help_x+n+1,x1)-help_x;
    int ri=upper_bound(help_x+1,help_x+n+1,x2)-help_x;
    ri--;

    //cout<<"le= "<<le<<" ri= "<<ri<<endl;

    if(le>ri)return;

    match(1,1,n,le,ri,sorted_inp[which]);
}
signed main()
{
    scanf("%i",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%i%i%i",&inp[i].x,&inp[i].y,&inp[i].r);
        inp[i].id=i;
    }

    for(int i=1;i<=n;i++)sorted_inp[i]=inp[i];

    sort(sorted_inp+1,sorted_inp+n+1,cmp);

    for(int i=1;i<=n;i++)help_x[i]=sorted_inp[i].x;

    sort(help_x+1,help_x+n+1);

    for(int i=1;i<=n;i++)
    {
        int pos=lower_bound(help_x+1,help_x+n+1,sorted_inp[i].x)-help_x;

        update(1,1,n,pos,sorted_inp[i]);
    }

    for(int i=1;i<=n;i++)
        if(outp[sorted_inp[i].id]==0)
            push(i);

    for(int i=1;i<=n;i++)printf("%i ",outp[i]);printf("\n");
    return 0;
}

Compilation message

circle_selection.cpp: In function 'int main()':
circle_selection.cpp:151:5: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
  151 |     for(int i=1;i<=n;i++)printf("%i ",outp[i]);printf("\n");
      |     ^~~
circle_selection.cpp:151:48: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
  151 |     for(int i=1;i<=n;i++)printf("%i ",outp[i]);printf("\n");
      |                                                ^~~~~~
circle_selection.cpp:125:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  125 |     scanf("%i",&n);
      |     ~~~~~^~~~~~~~~
circle_selection.cpp:128:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  128 |         scanf("%i%i%i",&inp[i].x,&inp[i].y,&inp[i].r);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 41 ms 56824 KB Output is correct
2 Correct 41 ms 56764 KB Output is correct
3 Correct 43 ms 56696 KB Output is correct
4 Correct 41 ms 56732 KB Output is correct
5 Correct 42 ms 56696 KB Output is correct
6 Correct 49 ms 56776 KB Output is correct
7 Correct 40 ms 56700 KB Output is correct
8 Correct 41 ms 56704 KB Output is correct
9 Correct 41 ms 56792 KB Output is correct
10 Correct 42 ms 56700 KB Output is correct
11 Correct 43 ms 56696 KB Output is correct
12 Correct 48 ms 56696 KB Output is correct
13 Correct 48 ms 56704 KB Output is correct
14 Correct 41 ms 56700 KB Output is correct
15 Correct 44 ms 56696 KB Output is correct
16 Correct 51 ms 57208 KB Output is correct
17 Correct 47 ms 57288 KB Output is correct
18 Correct 44 ms 57208 KB Output is correct
19 Correct 73 ms 60152 KB Output is correct
20 Correct 76 ms 60280 KB Output is correct
21 Correct 79 ms 60152 KB Output is correct
22 Correct 67 ms 60024 KB Output is correct
23 Correct 82 ms 60108 KB Output is correct
24 Correct 63 ms 60024 KB Output is correct
25 Correct 63 ms 60024 KB Output is correct
26 Correct 79 ms 60152 KB Output is correct
# Verdict Execution time Memory Grader output
1 Execution timed out 3089 ms 234256 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 42 ms 56696 KB Output is correct
2 Correct 2338 ms 144388 KB Output is correct
3 Execution timed out 3069 ms 240524 KB Time limit exceeded
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 3101 ms 245692 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 41 ms 56824 KB Output is correct
2 Correct 41 ms 56764 KB Output is correct
3 Correct 43 ms 56696 KB Output is correct
4 Correct 41 ms 56732 KB Output is correct
5 Correct 42 ms 56696 KB Output is correct
6 Correct 49 ms 56776 KB Output is correct
7 Correct 40 ms 56700 KB Output is correct
8 Correct 41 ms 56704 KB Output is correct
9 Correct 41 ms 56792 KB Output is correct
10 Correct 42 ms 56700 KB Output is correct
11 Correct 43 ms 56696 KB Output is correct
12 Correct 48 ms 56696 KB Output is correct
13 Correct 48 ms 56704 KB Output is correct
14 Correct 41 ms 56700 KB Output is correct
15 Correct 44 ms 56696 KB Output is correct
16 Correct 51 ms 57208 KB Output is correct
17 Correct 47 ms 57288 KB Output is correct
18 Correct 44 ms 57208 KB Output is correct
19 Correct 73 ms 60152 KB Output is correct
20 Correct 76 ms 60280 KB Output is correct
21 Correct 79 ms 60152 KB Output is correct
22 Correct 67 ms 60024 KB Output is correct
23 Correct 82 ms 60108 KB Output is correct
24 Correct 63 ms 60024 KB Output is correct
25 Correct 63 ms 60024 KB Output is correct
26 Correct 79 ms 60152 KB Output is correct
27 Correct 105 ms 64088 KB Output is correct
28 Correct 110 ms 64084 KB Output is correct
29 Correct 112 ms 64040 KB Output is correct
30 Correct 118 ms 63908 KB Output is correct
31 Correct 114 ms 63864 KB Output is correct
32 Correct 121 ms 64004 KB Output is correct
33 Correct 1867 ms 145416 KB Output is correct
34 Correct 1933 ms 145176 KB Output is correct
35 Correct 1866 ms 145136 KB Output is correct
36 Correct 1983 ms 144352 KB Output is correct
37 Correct 1869 ms 144344 KB Output is correct
38 Correct 2118 ms 144260 KB Output is correct
39 Execution timed out 3064 ms 143116 KB Time limit exceeded
40 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 41 ms 56824 KB Output is correct
2 Correct 41 ms 56764 KB Output is correct
3 Correct 43 ms 56696 KB Output is correct
4 Correct 41 ms 56732 KB Output is correct
5 Correct 42 ms 56696 KB Output is correct
6 Correct 49 ms 56776 KB Output is correct
7 Correct 40 ms 56700 KB Output is correct
8 Correct 41 ms 56704 KB Output is correct
9 Correct 41 ms 56792 KB Output is correct
10 Correct 42 ms 56700 KB Output is correct
11 Correct 43 ms 56696 KB Output is correct
12 Correct 48 ms 56696 KB Output is correct
13 Correct 48 ms 56704 KB Output is correct
14 Correct 41 ms 56700 KB Output is correct
15 Correct 44 ms 56696 KB Output is correct
16 Correct 51 ms 57208 KB Output is correct
17 Correct 47 ms 57288 KB Output is correct
18 Correct 44 ms 57208 KB Output is correct
19 Correct 73 ms 60152 KB Output is correct
20 Correct 76 ms 60280 KB Output is correct
21 Correct 79 ms 60152 KB Output is correct
22 Correct 67 ms 60024 KB Output is correct
23 Correct 82 ms 60108 KB Output is correct
24 Correct 63 ms 60024 KB Output is correct
25 Correct 63 ms 60024 KB Output is correct
26 Correct 79 ms 60152 KB Output is correct
27 Execution timed out 3089 ms 234256 KB Time limit exceeded
28 Halted 0 ms 0 KB -