답안 #318490

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
318490 2020-11-02T06:34:00 Z IloveN 원 고르기 (APIO18_circle_selection) C++14
37 / 100
3000 ms 366832 KB
#include<bits/stdc++.h>

using namespace std;
#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define eb emplace_back
#define all(vr) vr.begin(),vr.end()
#define vi vector<int>
#define vll vector<ll>
const int N=3e5+10;
const ll inf=1e9;
struct circle{int x,y,r,id;};

circle a[N];
int n;

struct segment_tree_2d
{
    vi it[N*4],pre[N*4],nex[N*4];
    vector<pii> val[N*4];
    pii arr[N];
    int len;

    void build_sub(int sub,int id,int l,int r)
    {
        if (l==r)
        {
            it[sub][id]=1;
            return;
        }
        int mid=(l+r)/2;
        build_sub(sub,id*2,l,mid);
        build_sub(sub,id*2+1,mid+1,r);
        it[sub][id]=1;
    }

    void build(int id,int l,int r)
    {
        if (l==r)
        {
            val[id].eb(arr[l]);
            it[id].resize(5,0);
            build_sub(id,1,1,1);
            pre[id].eb(-1);
            nex[id].eb(2);
            return;
        }
        int mid=(l+r)/2;
        build(id*2,l,mid);
        build(id*2+1,mid+1,r);
        val[id].resize(val[id*2].size()+val[id*2+1].size());
        merge(all(val[id*2]),all(val[id*2+1]),val[id].begin());
        pre[id].resize(val[id].size());
        nex[id].resize(val[id].size());
        for (int i=0;i<(int)val[id].size();i++) pre[id][i]=i-1,nex[id][i]=i+1;
        it[id].resize(val[id].size()*4+1);
        build_sub(id,1,1,val[id].size());
    }

    void input(pii ar[],int siz)
    {
        len=siz;
        for (int i=1;i<=len;i++) arr[i]=ar[i];
        build(1,1,len);
    }

    void update_sub(int sub,int id,int l,int r,int v)
    {
        if (l==r)
        {
            it[sub][id]=0;
            return;
        }
        int mid=(l+r)/2;
        if (v<=mid) update_sub(sub,id*2,l,mid,v);
        else update_sub(sub,id*2+1,mid+1,r,v);
        it[sub][id]=max(it[sub][id*2],it[sub][id*2+1]);
    }

    void update(int id,int l,int r,int v)
    {
        int pos=lower_bound(all(val[id]),arr[v])-val[id].begin();
        update_sub(id,1,1,val[id].size(),pos+1);
        if (pre[id][pos]>-1) nex[id][pre[id][pos]]=nex[id][pos];
        if (nex[id][pos]<(int)val[id].size()) pre[id][nex[id][pos]]=pre[id][pos];
        if (l==r) return;
        int mid=(l+r)/2;
        if (v<=mid) update(id*2,l,mid,v);
        else update(id*2+1,mid+1,r,v);
    }

    int lw_sub(int sub,int id,int l,int r,int v)
    {
        if (r<v || it[sub][id]==0) return -1;
        if (l==r) return l;
        int mid=(l+r)/2;
        int res=lw_sub(sub,id*2,l,mid,v);
        if (res==-1) return lw_sub(sub,id*2+1,mid+1,r,v);
        return res;
    }

    vi pot;

    void searc(int id,int l,int r,int u,int v,int y1,int y2)
    {
        if (l>v || r<u) return;
        if (u<=l && r<=v)
        {
            int pos=lower_bound(all(val[id]),mp(y1,0))-val[id].begin()+1;
            pos=lw_sub(id,1,1,val[id].size(),pos)-1;
            if (pos<0) return;
            while (pos<(int)val[id].size() && val[id][pos].fi<=y2)
            {
                pot.eb(val[id][pos].se);
                pos=nex[id][pos];
            }
            return;
        }
        int mid=(l+r)/2;
        searc(id*2,l,mid,u,v,y1,y2);
        searc(id*2+1,mid+1,r,u,v,y1,y2);
    }

    vi find_pot(int u,int v,int y1,int y2)
    {
        pot.clear();
        if (u<=v) searc(1,1,n,u,v,y1,y2);
        return pot;
    }

    void del(vi &vt)
    {
        for (int x : vt) update(1,1,n,x);
    }
} seg;

void read()
{
    cin>>n;
    for (int i=1;i<=n;i++) cin>>a[i].x>>a[i].y>>a[i].r,a[i].id=i;
}

bool cmp(circle &obj1, circle &obj2) { return (obj1.r>obj2.r) || ((obj1.r==obj2.r) && (obj1.id<obj2.id));}
pii X[N],Y[N];
int ans[N];

ll sqr(ll x) { return x*x;}

bool intersect(int i,int j)
{
    return sqr(a[i].x-a[j].x)+sqr(a[i].y-a[j].y)<=sqr(a[i].r+a[j].r);
}

void process()
{
    sort(a+1,a+n+1,cmp);
    for (int i=1;i<=n;i++) X[i]=mp(a[i].x,i);
    sort(X+1,X+n+1);
    for (int i=1;i<=n;i++) Y[i]=mp(a[X[i].se].y,i);
    seg.input(Y,n);
    for (int i=1;i<=n;i++)
    if (ans[a[i].id]==0)
    {
        int x1=max(-inf,(ll)a[i].x-a[i].r*2),x2=min(inf,(ll)a[i].x+a[i].r*2);
        int y1=max(-inf,(ll)a[i].y-a[i].r*2),y2=min(inf,(ll)a[i].y+a[i].r*2);
        int u=lower_bound(X+1,X+n+1,mp(x1,0))-X;
        int v=upper_bound(X+1,X+n+1,mp(x2,n+2))-X-1;
        vi vt=seg.find_pot(u,v,y1,y2);
        vi vt2;
        for (int x : vt)
            if (intersect(i,X[x].se)) ans[a[X[x].se].id]=a[i].id,vt2.eb(x);
        seg.del(vt2);
    }
    for (int i=1;i<=n;i++) cout<<ans[i]<<" ";
}

int main()
{
    //freopen("ss.inp","r",stdin);
    //ios::sync_with_stdio(false);
    //cin.tie(0);
    read();
    process();
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 73 ms 115556 KB Output is correct
2 Correct 71 ms 115428 KB Output is correct
3 Correct 70 ms 115428 KB Output is correct
4 Correct 73 ms 115428 KB Output is correct
5 Correct 72 ms 115428 KB Output is correct
6 Correct 71 ms 115428 KB Output is correct
7 Correct 72 ms 115464 KB Output is correct
8 Correct 72 ms 115412 KB Output is correct
9 Correct 70 ms 115428 KB Output is correct
10 Correct 71 ms 115428 KB Output is correct
11 Correct 69 ms 115428 KB Output is correct
12 Correct 70 ms 115428 KB Output is correct
13 Correct 72 ms 115428 KB Output is correct
14 Correct 72 ms 115556 KB Output is correct
15 Correct 72 ms 115428 KB Output is correct
16 Correct 74 ms 115940 KB Output is correct
17 Correct 74 ms 116068 KB Output is correct
18 Correct 75 ms 115940 KB Output is correct
19 Correct 97 ms 118884 KB Output is correct
20 Correct 94 ms 118756 KB Output is correct
21 Correct 99 ms 118756 KB Output is correct
22 Correct 101 ms 118648 KB Output is correct
23 Correct 108 ms 118628 KB Output is correct
24 Correct 101 ms 118628 KB Output is correct
25 Correct 99 ms 118624 KB Output is correct
26 Correct 100 ms 118628 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2098 ms 366832 KB Output is correct
2 Correct 2102 ms 364944 KB Output is correct
3 Correct 2104 ms 365652 KB Output is correct
4 Correct 2089 ms 366804 KB Output is correct
5 Correct 2191 ms 361148 KB Output is correct
6 Execution timed out 3112 ms 361312 KB Time limit exceeded
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 76 ms 115556 KB Output is correct
2 Correct 1630 ms 193644 KB Output is correct
3 Execution timed out 3042 ms 362852 KB Time limit exceeded
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3083 ms 362216 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 73 ms 115556 KB Output is correct
2 Correct 71 ms 115428 KB Output is correct
3 Correct 70 ms 115428 KB Output is correct
4 Correct 73 ms 115428 KB Output is correct
5 Correct 72 ms 115428 KB Output is correct
6 Correct 71 ms 115428 KB Output is correct
7 Correct 72 ms 115464 KB Output is correct
8 Correct 72 ms 115412 KB Output is correct
9 Correct 70 ms 115428 KB Output is correct
10 Correct 71 ms 115428 KB Output is correct
11 Correct 69 ms 115428 KB Output is correct
12 Correct 70 ms 115428 KB Output is correct
13 Correct 72 ms 115428 KB Output is correct
14 Correct 72 ms 115556 KB Output is correct
15 Correct 72 ms 115428 KB Output is correct
16 Correct 74 ms 115940 KB Output is correct
17 Correct 74 ms 116068 KB Output is correct
18 Correct 75 ms 115940 KB Output is correct
19 Correct 97 ms 118884 KB Output is correct
20 Correct 94 ms 118756 KB Output is correct
21 Correct 99 ms 118756 KB Output is correct
22 Correct 101 ms 118648 KB Output is correct
23 Correct 108 ms 118628 KB Output is correct
24 Correct 101 ms 118628 KB Output is correct
25 Correct 99 ms 118624 KB Output is correct
26 Correct 100 ms 118628 KB Output is correct
27 Correct 130 ms 122468 KB Output is correct
28 Correct 130 ms 122468 KB Output is correct
29 Correct 135 ms 122468 KB Output is correct
30 Correct 156 ms 122200 KB Output is correct
31 Correct 152 ms 122236 KB Output is correct
32 Correct 160 ms 122212 KB Output is correct
33 Correct 966 ms 194908 KB Output is correct
34 Correct 969 ms 194908 KB Output is correct
35 Correct 969 ms 194908 KB Output is correct
36 Correct 1546 ms 193380 KB Output is correct
37 Correct 1555 ms 193480 KB Output is correct
38 Correct 1586 ms 193560 KB Output is correct
39 Correct 1428 ms 192724 KB Output is correct
40 Correct 1417 ms 192724 KB Output is correct
41 Correct 1423 ms 192724 KB Output is correct
42 Correct 1179 ms 192612 KB Output is correct
43 Correct 1371 ms 193404 KB Output is correct
44 Correct 1382 ms 193408 KB Output is correct
45 Correct 1391 ms 193572 KB Output is correct
46 Correct 1376 ms 193416 KB Output is correct
47 Correct 1373 ms 193508 KB Output is correct
48 Correct 1385 ms 193636 KB Output is correct
49 Correct 1405 ms 193508 KB Output is correct
50 Correct 1392 ms 193508 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 73 ms 115556 KB Output is correct
2 Correct 71 ms 115428 KB Output is correct
3 Correct 70 ms 115428 KB Output is correct
4 Correct 73 ms 115428 KB Output is correct
5 Correct 72 ms 115428 KB Output is correct
6 Correct 71 ms 115428 KB Output is correct
7 Correct 72 ms 115464 KB Output is correct
8 Correct 72 ms 115412 KB Output is correct
9 Correct 70 ms 115428 KB Output is correct
10 Correct 71 ms 115428 KB Output is correct
11 Correct 69 ms 115428 KB Output is correct
12 Correct 70 ms 115428 KB Output is correct
13 Correct 72 ms 115428 KB Output is correct
14 Correct 72 ms 115556 KB Output is correct
15 Correct 72 ms 115428 KB Output is correct
16 Correct 74 ms 115940 KB Output is correct
17 Correct 74 ms 116068 KB Output is correct
18 Correct 75 ms 115940 KB Output is correct
19 Correct 97 ms 118884 KB Output is correct
20 Correct 94 ms 118756 KB Output is correct
21 Correct 99 ms 118756 KB Output is correct
22 Correct 101 ms 118648 KB Output is correct
23 Correct 108 ms 118628 KB Output is correct
24 Correct 101 ms 118628 KB Output is correct
25 Correct 99 ms 118624 KB Output is correct
26 Correct 100 ms 118628 KB Output is correct
27 Correct 2098 ms 366832 KB Output is correct
28 Correct 2102 ms 364944 KB Output is correct
29 Correct 2104 ms 365652 KB Output is correct
30 Correct 2089 ms 366804 KB Output is correct
31 Correct 2191 ms 361148 KB Output is correct
32 Execution timed out 3112 ms 361312 KB Time limit exceeded
33 Halted 0 ms 0 KB -