// M
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 300005;
int n, X[N], Y[N], R[N], M[N];
vector < int > UX, UY;
vector < pair < int , int > > V[N * 2];
set < pair < int , int > > ST[N * 2];
inline int GetId(int a, vector < int > &U)
{
return (int)(lower_bound(U.begin(), U.end(), a) - U.begin());
}
inline bool Check(int i, int j)
{
return ((ll)(X[i] - X[j]) * (X[i] - X[j]) + (ll)(Y[i] - Y[j]) * (Y[i] - Y[j]) <= (ll)(R[i] + R[j]) * (R[i] + R[j]));
}
inline void Get(int l, int r, int le, int ri, int i)
{
l += (int)UX.size();
r += (int)UX.size();
for (; l < r; l >>= 1, r >>= 1)
{
if (l & 1)
{
auto it = ST[l].lower_bound({le, -1});
while (it != ST[l].end() && it->first < ri)
{
if (M[it->second])
it = ST[l].erase(it);
else if (Check(i, it->second))
M[it->second] = i, it = ST[l].erase(it);
else
it ++;
}
l ++;
}
if (r & 1)
{
r --;
auto it = ST[r].lower_bound({le, -1});
while (it != ST[r].end() && it->first < ri)
{
if (M[it->second])
it = ST[r].erase(it);
else if (Check(i, it->second))
M[it->second] = i, it = ST[r].erase(it);
else
it ++;
}
}
}
}
inline void Do(int i)
{
M[i] = i;
int lx = GetId(X[i] - R[i] * 2, UX);
int rx = GetId(X[i] + R[i] * 2 + 1, UX);
int ly = GetId(Y[i] - R[i] * 2, UY);
int ry = GetId(Y[i] + R[i] * 2 + 1, UY);
Get(lx, rx, ly, ry, i);
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i ++)
{
scanf("%d%d%d", &X[i], &Y[i], &R[i]);
UX.push_back(X[i]);
UY.push_back(Y[i]);
}
sort(UX.begin(), UX.end());
UX.resize(unique(UX.begin(), UX.end()) - UX.begin());
sort(UY.begin(), UY.end());
UY.resize(unique(UY.begin(), UY.end()) - UY.begin());
for (int i = 1; i <= n; i ++)
{
int x = GetId(X[i], UX);
int y = GetId(Y[i], UY);
V[x + (int)UX.size()].push_back({y, i});
}
for (int i = (int)UX.size(); i < (int)UX.size() * 2; i ++)
sort(V[i].begin(), V[i].end());
for (int i = (int)UX.size() - 1; i; i --)
merge(V[i << 1].begin(), V[i << 1].end(), V[i << 1 ^ 1].begin(), V[i << 1 ^ 1].end(), back_inserter(V[i]));
for (int i = 0; i < (int)UX.size() * 2; i ++)
ST[i] = set < pair < int , int > > (V[i].begin(), V[i].end());
set < pair < int , int > > TS;
for (int i = 1; i <= n; i ++)
TS.insert({-R[i], i});
while (TS.size())
{
while (TS.size() && M[TS.begin()->second])
TS.erase(TS.begin());
if (!TS.size())
break;
int i = TS.begin()->second;
TS.erase(TS.begin());
Do(i);
}
for (int i = 1; i <= n; i ++)
printf("%d ", M[i]);
printf("\n");
return 0;
}
Compilation message
circle_selection.cpp: In function 'int main()':
circle_selection.cpp:67:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d", &n);
~~~~~^~~~~~~~~~
circle_selection.cpp:70:22: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d%d", &X[i], &Y[i], &R[i]);
~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
27 ms |
42624 KB |
Output is correct |
2 |
Correct |
27 ms |
42624 KB |
Output is correct |
3 |
Correct |
27 ms |
42624 KB |
Output is correct |
4 |
Correct |
27 ms |
42624 KB |
Output is correct |
5 |
Correct |
27 ms |
42624 KB |
Output is correct |
6 |
Incorrect |
27 ms |
42624 KB |
Output isn't correct |
7 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1400 ms |
395848 KB |
Output is correct |
2 |
Correct |
1374 ms |
402080 KB |
Output is correct |
3 |
Correct |
1420 ms |
402252 KB |
Output is correct |
4 |
Incorrect |
1442 ms |
401892 KB |
Output isn't correct |
5 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
28 ms |
42616 KB |
Output is correct |
2 |
Correct |
617 ms |
154136 KB |
Output is correct |
3 |
Correct |
2095 ms |
402880 KB |
Output is correct |
4 |
Correct |
2086 ms |
402848 KB |
Output is correct |
5 |
Correct |
2107 ms |
392788 KB |
Output is correct |
6 |
Correct |
943 ms |
222472 KB |
Output is correct |
7 |
Correct |
450 ms |
133096 KB |
Output is correct |
8 |
Correct |
92 ms |
59124 KB |
Output is correct |
9 |
Correct |
2156 ms |
403396 KB |
Output is correct |
10 |
Correct |
2140 ms |
403784 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1826 ms |
396528 KB |
Output is correct |
2 |
Correct |
1657 ms |
406476 KB |
Output is correct |
3 |
Correct |
1562 ms |
403564 KB |
Output is correct |
4 |
Correct |
1674 ms |
402896 KB |
Output is correct |
5 |
Correct |
1738 ms |
402764 KB |
Output is correct |
6 |
Correct |
1623 ms |
404848 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
27 ms |
42624 KB |
Output is correct |
2 |
Correct |
27 ms |
42624 KB |
Output is correct |
3 |
Correct |
27 ms |
42624 KB |
Output is correct |
4 |
Correct |
27 ms |
42624 KB |
Output is correct |
5 |
Correct |
27 ms |
42624 KB |
Output is correct |
6 |
Incorrect |
27 ms |
42624 KB |
Output isn't correct |
7 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
27 ms |
42624 KB |
Output is correct |
2 |
Correct |
27 ms |
42624 KB |
Output is correct |
3 |
Correct |
27 ms |
42624 KB |
Output is correct |
4 |
Correct |
27 ms |
42624 KB |
Output is correct |
5 |
Correct |
27 ms |
42624 KB |
Output is correct |
6 |
Incorrect |
27 ms |
42624 KB |
Output isn't correct |
7 |
Halted |
0 ms |
0 KB |
- |