Submission #866311

# Submission time Handle Problem Language Result Execution time Memory
866311 2023-10-25T20:58:50 Z danikoynov Circle selection (APIO18_circle_selection) C++14
0 / 100
3000 ms 58912 KB
#include<bits/stdc++.h>
 
using namespace std;
typedef long long ll;
 
struct point
{
    ll x, y;
 
    point(ll _x = 0, ll _y = 0)
    {
        x = _x;
        y = _y;
    }
 
    void get()
    {
        cin >> x >> y;
    }
};
 
struct circle
{
    point centre;
    ll radius;
    int idx;
 
    circle(point _centre = point(), ll _radius = 0, int _idx = 0)
    {
        centre = _centre;
        radius = _radius;
        idx = _idx;
    }
 
    void get()
    {
        centre.get();
        cin >> radius;
    }
};

ll get_distance(point A, point B)
{
    return (A.x - B.x) * (A.x - B.x) +
            (A.y - B.y) * (A.y - B.y);
}

bool intersect(circle c1, circle c2)
{
    ll distance = get_distance(c1.centre, c2.centre);

    return (distance <= (c1.radius + c2.radius) * (c1.radius + c2.radius));
        
}
const int maxn = 3e5 + 10;
const int inf = 1e9 + 10;
 
bool cmpx(circle c1, circle c2)
{
    return c1.centre.x < c2.centre.x;
}
 
bool cmpy(circle c1, circle c2)
{
    return c1.centre.y < c2.centre.y;
}
 

int n;
circle c[maxn], cx[maxn], cy[maxn];
void input()
{
    cin >> n;
    for (int i = 1; i <= n; i ++)
    {
        c[i].get();
        c[i].idx = i;
        cx[i] = cy[i] = c[i];
    }
}

void sort_arrays()
{
    sort(cx + 1, cx + n + 1, cmpx);
    sort(cy + 1, cy + n + 1, cmpy);
}
 
 
vector < vector < circle > > field;
bool eliminated[maxn];
int parent[maxn];
point comp[maxn];

void restructure(int block)
{
    field.clear();
    vector < int > dx;
    int last = -inf;
    for (int i = 1; i <= n; i ++)
    {
        if (eliminated[cx[i].idx])
            continue;
        
        int cur = cx[i].centre.x / block;
        if (cur != last)
            field.emplace_back();
        
        comp[cx[i].idx].x = field.size() - 1;
    
        last = cur;
    }

    for (int i = 1; i <= n; i ++)
    {
        if (eliminated[cy[i].idx])
            continue;

        comp[cy[i].idx].y = field[comp[cy[i].idx].x].size();
        field[comp[cy[i].idx].x].push_back(cy[i]);
    }


}
 
 
void simulate()
{
    int last_block = 0;
    for (int i = 1; i <= n; i ++)
        last_block = max(last_block, (int)c[i].radius);

    restructure(last_block);

    while(true)
    {
        int idx = -1;
        for (int i = 1; i <= n; i ++)
        {
            if (eliminated[i])
                continue;
            if (idx == -1 || c[i].radius > c[idx].radius)
                idx = i;
        }

        if (idx == -1)
            break;  
        
        if (c[idx].radius <= last_block / 2)
        {
            last_block = c[idx].radius;
            restructure(last_block);
        }

        int cor_x = comp[idx].x, cor_y = comp[idx].y;
        for (int i = 0; i < field.size(); i ++)
        {
            for (int j = 0; j < field[i].size(); j ++)
            {
                if (intersect(field[i][j], c[idx]))
                {
                    parent[field[i][j].idx] = idx;
                    eliminated[field[i][j].idx] = 1;
                }
            }
        }

    }

    for (int i = 1; i <= n; i ++)
        cout << parent[i] << " ";
    cout << endl;
}
void solve()
{
    input();
    sort_arrays();
    simulate();
}
 
int main()
{
    solve();
    return 0;
}

/**
 11
9 9 2
13 2 1
11 8 2
3 3 2
3 12 1
12 14 1
9 8 5
2 8 2
5 2 1
14 4 2
14 14 1

*/

Compilation message

circle_selection.cpp: In function 'void simulate()':
circle_selection.cpp:155:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<circle> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  155 |         for (int i = 0; i < field.size(); i ++)
      |                         ~~^~~~~~~~~~~~~~
circle_selection.cpp:157:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<circle>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  157 |             for (int j = 0; j < field[i].size(); j ++)
      |                             ~~^~~~~~~~~~~~~~~~~
circle_selection.cpp:154:13: warning: unused variable 'cor_x' [-Wunused-variable]
  154 |         int cor_x = comp[idx].x, cor_y = comp[idx].y;
      |             ^~~~~
circle_selection.cpp:154:34: warning: unused variable 'cor_y' [-Wunused-variable]
  154 |         int cor_x = comp[idx].x, cor_y = comp[idx].y;
      |                                  ^~~~~
# Verdict Execution time Memory Grader output
1 Correct 5 ms 34648 KB Output is correct
2 Correct 6 ms 34652 KB Output is correct
3 Correct 5 ms 34652 KB Output is correct
4 Correct 5 ms 34652 KB Output is correct
5 Correct 6 ms 34652 KB Output is correct
6 Correct 5 ms 34748 KB Output is correct
7 Correct 6 ms 34740 KB Output is correct
8 Incorrect 6 ms 34652 KB Output isn't correct
9 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 372 ms 58904 KB Output is correct
2 Incorrect 309 ms 56256 KB Output isn't correct
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 5 ms 34652 KB Output is correct
2 Execution timed out 3016 ms 42868 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 3037 ms 58912 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 5 ms 34648 KB Output is correct
2 Correct 6 ms 34652 KB Output is correct
3 Correct 5 ms 34652 KB Output is correct
4 Correct 5 ms 34652 KB Output is correct
5 Correct 6 ms 34652 KB Output is correct
6 Correct 5 ms 34748 KB Output is correct
7 Correct 6 ms 34740 KB Output is correct
8 Incorrect 6 ms 34652 KB Output isn't correct
9 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 5 ms 34648 KB Output is correct
2 Correct 6 ms 34652 KB Output is correct
3 Correct 5 ms 34652 KB Output is correct
4 Correct 5 ms 34652 KB Output is correct
5 Correct 6 ms 34652 KB Output is correct
6 Correct 5 ms 34748 KB Output is correct
7 Correct 6 ms 34740 KB Output is correct
8 Incorrect 6 ms 34652 KB Output isn't correct
9 Halted 0 ms 0 KB -