#include <bits/stdc++.h>
#define ALL(x) x.begin(),x.end()
struct Circle
{
int64_t x;
int64_t y;
int64_t r;
int64_t i;
int64_t elimBy;
int64_t minX() const { return x - r; }
int64_t maxX() const { return x + r; }
int64_t minY() const { return y - r; }
int64_t maxY() const { return y + r; }
bool intersects(const Circle& other) const
{
int64_t dx = x - other.x;
int64_t dy = y - other.y;
int64_t rSum = r + other.r;
return dx * dx + dy * dy <= rSum * rSum;
}
bool contains(int64_t x, int64_t y) const
{
int64_t dx = x - this->x;
int64_t dy = y - this->y;
return dx * dx + dy * dy <= r * r;
}
};
Circle* outerCircle;
struct OctNode
{
int64_t minX;
int64_t minY;
int64_t maxX;
int64_t maxY;
std::vector<Circle*> circles;
OctNode* children = nullptr;
bool intersects(const Circle& c)
{
if (c.contains(minX, minY) || c.contains(minX, maxY - 1) || c.contains(maxX - 1, minY) || c.contains(maxX - 1, maxY - 1))
return true;
if (c.x >= minX && c.x < maxX && c.y >= minY && c.y < maxY)
return true;
return false;
}
bool contains(int64_t x, int64_t y, int64_t r)
{
return x - r >= minX && x + r < maxX && y - r >= minY && y + r < maxY;
}
void mark()
{
if (children)
{
for (int i = 0; i < 4; i++)
{
if (children[i].intersects(*outerCircle))
children[i].mark();
}
}
for (long i = circles.size() - 1; i >= 0; i--)
{
if (circles[i]->elimBy == -1 && circles[i]->intersects(*outerCircle))
{
circles[i]->elimBy = outerCircle->i;
circles[i] = circles.back();
circles.pop_back();
}
}
}
};
void genOctree(OctNode* node)
{
int64_t halfSX = (node->maxX - node->minX) / 2;
int64_t halfSY = (node->maxY - node->minY) / 2;
int64_t midX = node->minX + halfSX;
int64_t midY = node->minY + halfSY;
bool subdivide = false;
for (Circle* circle : node->circles)
{
if (circle->maxX() < midX || circle->minX() > midX || circle->maxY() > midY || circle->minY() < midY)
{
subdivide = true;
break;
}
}
if (!subdivide)
return;
node->children = new OctNode[4];
for (int i = 0; i < 4; i++)
{
node->children[i].minX = (i % 2) ? midX : node->minX;
node->children[i].maxX = (i % 2) ? node->maxX : midX;
node->children[i].minY = (i / 2) ? midY : node->minY;
node->children[i].maxY = (i / 2) ? node->maxY : midY;
node->children[i].circles.reserve(node->circles.size());
for (int j = node->circles.size() - 1; j >= 0; j--)
{
if (node->contains(node->circles[j]->x, node->circles[j]->y, node->circles[j]->r))
{
node->children[i].circles.push_back(node->circles[j]);
node->circles[j] = node->circles.back();
node->circles.pop_back();
}
}
}
}
int main()
{
int num;
std::cin >> num;
std::vector<Circle> circles(num);
std::vector<Circle*> cByMin(num);
std::vector<Circle*> cByMax(num);
bool allZeroY = true;
int64_t sameRad = -1;
for (int i = 0; i < num; i++)
{
std::cin >> circles[i].x;
std::cin >> circles[i].y;
std::cin >> circles[i].r;
circles[i].i = i;
circles[i].elimBy = -1;
cByMin[i] = &circles[i];
cByMax[i] = &circles[i];
if (i == 0)
sameRad = circles[i].r;
else if (sameRad != circles[i].r)
sameRad = -1;
if (circles[i].y != 0)
allZeroY = false;
}
if (sameRad == -1)
{
std::sort(ALL(circles), [&] (const Circle& a, const Circle& b)
{
if (a.r == b.r)
return a.i < b.i;
return a.r > b.r;
});
}
if (allZeroY)
{
std::sort(ALL(cByMin), [&] (const Circle* a, const Circle* b)
{
return a->minX() < b->minX();
});
std::sort(ALL(cByMax), [&] (const Circle* a, const Circle* b)
{
return a->maxX() < b->maxX();
});
for (Circle& outer : circles)
{
if (outer.elimBy != -1)
continue;
outer.elimBy = outer.i;
auto minB = std::lower_bound(ALL(cByMin), outer.minX(), [&] (Circle* c, int64_t pos) { return c->minX() < pos; });
auto minE = std::upper_bound(ALL(cByMin), outer.maxX(), [&] (int64_t pos, Circle* c) { return pos < c->minX(); });
auto maxB = std::lower_bound(ALL(cByMax), outer.minX(), [&] (Circle* c, int64_t pos) { return c->maxX() < pos; });
auto maxE = std::upper_bound(ALL(cByMax), outer.maxX(), [&] (int64_t pos, Circle* c) { return pos <= c->maxX(); });
std::for_each(minB, minE, [&] (Circle* c)
{
if (c->elimBy == -1)
c->elimBy = outer.i;
});
std::for_each(maxB, maxE, [&] (Circle* c)
{
if (c->elimBy == -1)
c->elimBy = outer.i;
});
}
}
else if (num <= 5000)
{
for (Circle& outer : circles)
{
if (outer.elimBy != -1)
continue;
outer.elimBy = outer.i;
for (Circle& inner : circles)
{
if (inner.elimBy == -1 && inner.intersects(outer))
inner.elimBy = outer.i;
}
}
}
else
{
int64_t minX;
int64_t minY;
int64_t maxX;
int64_t maxY;
OctNode root;
root.circles.reserve(circles.size());
root.minX = INT64_MAX;
root.minY = INT64_MAX;
root.maxX = INT64_MIN;
root.maxY = INT64_MIN;
for (Circle& circle : circles)
{
root.circles.push_back(&circle);
root.minX = std::min(root.minX, circle.minX());
root.maxX = std::min(root.maxX, circle.maxX());
root.minY = std::min(root.minY, circle.minY());
root.maxY = std::min(root.maxY, circle.maxY());
}
root.maxX++;
root.maxY++;
genOctree(&root);
for (Circle& circle : circles)
{
if (circle.elimBy == -1)
{
circle.elimBy = circle.i;
outerCircle = &circle;
root.mark();
}
}
}
std::vector<int64_t> result(num);
for (int i = 0; i < num; i++)
result[circles[i].i] = circles[i].elimBy + 1;
for (int i = 0; i < num; i++)
std::cout << result[i] << " ";
std::cout << std::endl;
}
Compilation message
circle_selection.cpp: In function 'int main()':
circle_selection.cpp:215:11: warning: unused variable 'minX' [-Wunused-variable]
int64_t minX;
^~~~
circle_selection.cpp:216:11: warning: unused variable 'minY' [-Wunused-variable]
int64_t minY;
^~~~
circle_selection.cpp:217:11: warning: unused variable 'maxX' [-Wunused-variable]
int64_t maxX;
^~~~
circle_selection.cpp:218:11: warning: unused variable 'maxY' [-Wunused-variable]
int64_t maxY;
^~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
376 KB |
Output is correct |
2 |
Correct |
3 ms |
488 KB |
Output is correct |
3 |
Correct |
2 ms |
540 KB |
Output is correct |
4 |
Correct |
3 ms |
540 KB |
Output is correct |
5 |
Correct |
3 ms |
540 KB |
Output is correct |
6 |
Correct |
3 ms |
540 KB |
Output is correct |
7 |
Correct |
3 ms |
540 KB |
Output is correct |
8 |
Correct |
4 ms |
540 KB |
Output is correct |
9 |
Correct |
2 ms |
572 KB |
Output is correct |
10 |
Correct |
4 ms |
620 KB |
Output is correct |
11 |
Correct |
4 ms |
620 KB |
Output is correct |
12 |
Correct |
2 ms |
620 KB |
Output is correct |
13 |
Correct |
3 ms |
620 KB |
Output is correct |
14 |
Correct |
3 ms |
620 KB |
Output is correct |
15 |
Correct |
3 ms |
620 KB |
Output is correct |
16 |
Correct |
5 ms |
620 KB |
Output is correct |
17 |
Correct |
6 ms |
620 KB |
Output is correct |
18 |
Correct |
7 ms |
620 KB |
Output is correct |
19 |
Correct |
19 ms |
892 KB |
Output is correct |
20 |
Correct |
18 ms |
936 KB |
Output is correct |
21 |
Correct |
14 ms |
952 KB |
Output is correct |
22 |
Correct |
63 ms |
952 KB |
Output is correct |
23 |
Correct |
67 ms |
1052 KB |
Output is correct |
24 |
Correct |
100 ms |
1092 KB |
Output is correct |
25 |
Correct |
94 ms |
1092 KB |
Output is correct |
26 |
Correct |
65 ms |
1092 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
849 ms |
21660 KB |
Output is correct |
2 |
Correct |
681 ms |
21676 KB |
Output is correct |
3 |
Correct |
656 ms |
21676 KB |
Output is correct |
4 |
Correct |
654 ms |
21676 KB |
Output is correct |
5 |
Correct |
843 ms |
21676 KB |
Output is correct |
6 |
Correct |
894 ms |
21676 KB |
Output is correct |
7 |
Correct |
646 ms |
21676 KB |
Output is correct |
8 |
Correct |
699 ms |
21676 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
21676 KB |
Output is correct |
2 |
Execution timed out |
3009 ms |
21676 KB |
Time limit exceeded |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
3020 ms |
21676 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
376 KB |
Output is correct |
2 |
Correct |
3 ms |
488 KB |
Output is correct |
3 |
Correct |
2 ms |
540 KB |
Output is correct |
4 |
Correct |
3 ms |
540 KB |
Output is correct |
5 |
Correct |
3 ms |
540 KB |
Output is correct |
6 |
Correct |
3 ms |
540 KB |
Output is correct |
7 |
Correct |
3 ms |
540 KB |
Output is correct |
8 |
Correct |
4 ms |
540 KB |
Output is correct |
9 |
Correct |
2 ms |
572 KB |
Output is correct |
10 |
Correct |
4 ms |
620 KB |
Output is correct |
11 |
Correct |
4 ms |
620 KB |
Output is correct |
12 |
Correct |
2 ms |
620 KB |
Output is correct |
13 |
Correct |
3 ms |
620 KB |
Output is correct |
14 |
Correct |
3 ms |
620 KB |
Output is correct |
15 |
Correct |
3 ms |
620 KB |
Output is correct |
16 |
Correct |
5 ms |
620 KB |
Output is correct |
17 |
Correct |
6 ms |
620 KB |
Output is correct |
18 |
Correct |
7 ms |
620 KB |
Output is correct |
19 |
Correct |
19 ms |
892 KB |
Output is correct |
20 |
Correct |
18 ms |
936 KB |
Output is correct |
21 |
Correct |
14 ms |
952 KB |
Output is correct |
22 |
Correct |
63 ms |
952 KB |
Output is correct |
23 |
Correct |
67 ms |
1052 KB |
Output is correct |
24 |
Correct |
100 ms |
1092 KB |
Output is correct |
25 |
Correct |
94 ms |
1092 KB |
Output is correct |
26 |
Correct |
65 ms |
1092 KB |
Output is correct |
27 |
Correct |
23 ms |
21676 KB |
Output is correct |
28 |
Correct |
22 ms |
21676 KB |
Output is correct |
29 |
Correct |
24 ms |
21676 KB |
Output is correct |
30 |
Correct |
293 ms |
21676 KB |
Output is correct |
31 |
Correct |
401 ms |
21676 KB |
Output is correct |
32 |
Correct |
316 ms |
21676 KB |
Output is correct |
33 |
Correct |
205 ms |
21676 KB |
Output is correct |
34 |
Correct |
200 ms |
21676 KB |
Output is correct |
35 |
Correct |
237 ms |
21676 KB |
Output is correct |
36 |
Execution timed out |
3010 ms |
21676 KB |
Time limit exceeded |
37 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
376 KB |
Output is correct |
2 |
Correct |
3 ms |
488 KB |
Output is correct |
3 |
Correct |
2 ms |
540 KB |
Output is correct |
4 |
Correct |
3 ms |
540 KB |
Output is correct |
5 |
Correct |
3 ms |
540 KB |
Output is correct |
6 |
Correct |
3 ms |
540 KB |
Output is correct |
7 |
Correct |
3 ms |
540 KB |
Output is correct |
8 |
Correct |
4 ms |
540 KB |
Output is correct |
9 |
Correct |
2 ms |
572 KB |
Output is correct |
10 |
Correct |
4 ms |
620 KB |
Output is correct |
11 |
Correct |
4 ms |
620 KB |
Output is correct |
12 |
Correct |
2 ms |
620 KB |
Output is correct |
13 |
Correct |
3 ms |
620 KB |
Output is correct |
14 |
Correct |
3 ms |
620 KB |
Output is correct |
15 |
Correct |
3 ms |
620 KB |
Output is correct |
16 |
Correct |
5 ms |
620 KB |
Output is correct |
17 |
Correct |
6 ms |
620 KB |
Output is correct |
18 |
Correct |
7 ms |
620 KB |
Output is correct |
19 |
Correct |
19 ms |
892 KB |
Output is correct |
20 |
Correct |
18 ms |
936 KB |
Output is correct |
21 |
Correct |
14 ms |
952 KB |
Output is correct |
22 |
Correct |
63 ms |
952 KB |
Output is correct |
23 |
Correct |
67 ms |
1052 KB |
Output is correct |
24 |
Correct |
100 ms |
1092 KB |
Output is correct |
25 |
Correct |
94 ms |
1092 KB |
Output is correct |
26 |
Correct |
65 ms |
1092 KB |
Output is correct |
27 |
Correct |
849 ms |
21660 KB |
Output is correct |
28 |
Correct |
681 ms |
21676 KB |
Output is correct |
29 |
Correct |
656 ms |
21676 KB |
Output is correct |
30 |
Correct |
654 ms |
21676 KB |
Output is correct |
31 |
Correct |
843 ms |
21676 KB |
Output is correct |
32 |
Correct |
894 ms |
21676 KB |
Output is correct |
33 |
Correct |
646 ms |
21676 KB |
Output is correct |
34 |
Correct |
699 ms |
21676 KB |
Output is correct |
35 |
Correct |
3 ms |
21676 KB |
Output is correct |
36 |
Execution timed out |
3009 ms |
21676 KB |
Time limit exceeded |
37 |
Halted |
0 ms |
0 KB |
- |