Submission #895444

# Submission time Handle Problem Language Result Execution time Memory
895444 2023-12-30T00:32:19 Z MilosMilutinovic Circle selection (APIO18_circle_selection) C++14
37 / 100
3000 ms 860612 KB
#include <bits/stdc++.h>

using namespace std;

const int MAX = 3e5;
const int N = 4e6;

long long x[MAX], y[MAX], r[MAX];
int res[MAX], len, cur;
vector<pair<long long, int>> vec[N];
vector<int> xs;
vector<int> mn[N];
vector<int> mx[N];
vector<int> fa[N];
vector<bool> rem[N];

void Insert(int i, pair<long long, int> v) {
  for (int x = i + len; x > 0; x >>= 1) {
    vec[x].push_back(v);
  }
}

void Build() {
  for (int x = 1; x < 2 * len; x++) {
    sort(vec[x].begin(), vec[x].end());
    int k = (int) vec[x].size();
    mn[x] = vector<int>(k);
    mx[x] = vector<int>(k);
    fa[x] = vector<int>(k);
    rem[x] = vector<bool>(k);
    iota(mn[x].begin(), mn[x].end(), 0);
    iota(mx[x].begin(), mx[x].end(), 0);
    iota(fa[x].begin(), fa[x].end(), 0);
  }
}

void Unite(int x, int a, int b) {
  a = fa[x][a];
  b = fa[x][b];
  if (a == b) {
    return;
  }
  if (mx[x][a] - mn[x][a] > mx[x][b] - mn[x][b]) {
    swap(a, b);
  }
  for (int i = mn[x][a]; i <= mx[x][a]; i++) {
    fa[x][i] = b;
  }
  mx[x][b] = max(mx[x][b], mx[x][a]);
  mn[x][b] = min(mn[x][b], mn[x][b]);
}

void Delete(int i, pair<long long, int> v) {
  for (int x = i + len; x > 0; x >>= 1) {
    int idx = (int) (lower_bound(vec[x].begin(), vec[x].end(), v) - vec[x].begin());
    rem[x][idx] = true;
    if (idx > 0 && rem[x][idx - 1]) {
      Unite(x, idx - 1, idx);
    }
    if (idx + 1 < (int) vec[x].size() && rem[x][idx + 1]) {
      Unite(x, idx, idx + 1);
    }
  }
}

void Check(int idx) {
  if ((x[cur] - x[idx]) * 1LL * (x[cur] - x[idx]) + (y[cur] - y[idx]) * 1LL * (y[cur] - y[idx]) <= (r[cur] + r[idx]) * 1LL * (r[cur] + r[idx])) {
    res[idx] = cur;
    Delete((int) (lower_bound(xs.begin(), xs.end(), x[idx]) - xs.begin()), make_pair(y[idx], idx));
  }
}

void Add(int x, long long L, long long R) {
  int idx = (int) (lower_bound(vec[x].begin(), vec[x].end(), make_pair(L, -1)) - vec[x].begin());
  while (idx < (int) vec[x].size() && vec[x][idx].first <= R) {
    if (rem[x][idx]) {
      idx = mx[x][fa[x][idx]] + 1;
      continue;
    }
    Check(vec[x][idx].second);
    idx += 1;
  }
}

void Query(int l, int r, long long L, long long R) {
  for (l += len, r += len + 1; l < r; l >>= 1, r >>= 1) {
    if (l & 1) {
      Add(l++, L, R);
    }
    if (r & 1) {
      Add(--r, L, R);
    }
  }
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n;
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> x[i] >> y[i] >> r[i];
  }
  vector<int> order(n);
  iota(order.begin(), order.end(), 0);
  sort(order.begin(), order.end(), [&](int i, int j) {
    if (r[i] != r[j]) {
      return r[i] > r[j];
    } else {
      return i < j;
    }
  });
  for (int i = 0; i < n; i++) {
    xs.push_back(x[i] - 2 * r[i]);
    xs.push_back(x[i]);
    xs.push_back(x[i] + 2 * r[i]);
  }
  sort(xs.begin(), xs.end());
  xs.erase(unique(xs.begin(), xs.end()), xs.end());
  int k = (int) xs.size();
  len = 1;
  while (len < k) {
    len *= 2;
  }
  for (int i = 0; i < n; i++) {
    res[i] = i;
    int p = (int) (lower_bound(xs.begin(), xs.end(), x[i]) - xs.begin());
    Insert(p, make_pair(y[i], i));
  }
  Build();
  for (int i : order) {
    if (res[i] != i) {
      continue;
    }
    cur = i;
    int p = (int) (lower_bound(xs.begin(), xs.end(), x[i]) - xs.begin());
    Delete(p, make_pair(y[i], i));
    int L = (int) (lower_bound(xs.begin(), xs.end(), x[i] - 2 * r[i]) - xs.begin());
    int R = (int) (lower_bound(xs.begin(), xs.end(), x[i] + 2 * r[i]) - xs.begin());
    Query(L, R, y[i] - 2 * r[i], y[i] + 2 * r[i]);
  }
  for (int i = 0; i < n; i++) {
    cout << res[i] + 1 << " ";
  }
  return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 161 ms 538208 KB Output is correct
2 Correct 111 ms 538224 KB Output is correct
3 Correct 112 ms 538064 KB Output is correct
4 Correct 113 ms 538196 KB Output is correct
5 Correct 110 ms 538192 KB Output is correct
6 Correct 111 ms 538196 KB Output is correct
7 Correct 114 ms 538328 KB Output is correct
8 Correct 120 ms 538108 KB Output is correct
9 Correct 111 ms 538192 KB Output is correct
10 Correct 111 ms 538292 KB Output is correct
11 Correct 115 ms 538308 KB Output is correct
12 Correct 113 ms 538192 KB Output is correct
13 Correct 113 ms 538288 KB Output is correct
14 Correct 112 ms 538196 KB Output is correct
15 Correct 113 ms 538196 KB Output is correct
16 Correct 115 ms 538708 KB Output is correct
17 Correct 116 ms 538960 KB Output is correct
18 Correct 123 ms 538956 KB Output is correct
19 Correct 129 ms 541644 KB Output is correct
20 Correct 126 ms 541636 KB Output is correct
21 Correct 127 ms 541860 KB Output is correct
22 Correct 130 ms 542656 KB Output is correct
23 Correct 132 ms 542544 KB Output is correct
24 Correct 130 ms 542660 KB Output is correct
25 Correct 133 ms 542772 KB Output is correct
26 Correct 132 ms 542656 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2043 ms 841716 KB Output is correct
2 Correct 2059 ms 839240 KB Output is correct
3 Correct 2095 ms 837512 KB Output is correct
4 Correct 2087 ms 845868 KB Output is correct
5 Correct 2181 ms 783564 KB Output is correct
6 Execution timed out 3101 ms 860612 KB Time limit exceeded
7 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 114 ms 538108 KB Output is correct
2 Correct 1132 ms 643996 KB Output is correct
3 Execution timed out 3074 ms 860608 KB Time limit exceeded
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 3044 ms 859332 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 161 ms 538208 KB Output is correct
2 Correct 111 ms 538224 KB Output is correct
3 Correct 112 ms 538064 KB Output is correct
4 Correct 113 ms 538196 KB Output is correct
5 Correct 110 ms 538192 KB Output is correct
6 Correct 111 ms 538196 KB Output is correct
7 Correct 114 ms 538328 KB Output is correct
8 Correct 120 ms 538108 KB Output is correct
9 Correct 111 ms 538192 KB Output is correct
10 Correct 111 ms 538292 KB Output is correct
11 Correct 115 ms 538308 KB Output is correct
12 Correct 113 ms 538192 KB Output is correct
13 Correct 113 ms 538288 KB Output is correct
14 Correct 112 ms 538196 KB Output is correct
15 Correct 113 ms 538196 KB Output is correct
16 Correct 115 ms 538708 KB Output is correct
17 Correct 116 ms 538960 KB Output is correct
18 Correct 123 ms 538956 KB Output is correct
19 Correct 129 ms 541644 KB Output is correct
20 Correct 126 ms 541636 KB Output is correct
21 Correct 127 ms 541860 KB Output is correct
22 Correct 130 ms 542656 KB Output is correct
23 Correct 132 ms 542544 KB Output is correct
24 Correct 130 ms 542660 KB Output is correct
25 Correct 133 ms 542772 KB Output is correct
26 Correct 132 ms 542656 KB Output is correct
27 Correct 144 ms 545864 KB Output is correct
28 Correct 157 ms 545996 KB Output is correct
29 Correct 143 ms 545996 KB Output is correct
30 Correct 157 ms 547284 KB Output is correct
31 Correct 154 ms 547328 KB Output is correct
32 Correct 158 ms 547396 KB Output is correct
33 Correct 656 ms 625964 KB Output is correct
34 Correct 669 ms 632688 KB Output is correct
35 Correct 703 ms 635336 KB Output is correct
36 Correct 1118 ms 644316 KB Output is correct
37 Correct 1112 ms 644556 KB Output is correct
38 Correct 1102 ms 643840 KB Output is correct
39 Correct 556 ms 576456 KB Output is correct
40 Correct 573 ms 576604 KB Output is correct
41 Correct 555 ms 576248 KB Output is correct
42 Correct 537 ms 585096 KB Output is correct
43 Correct 1016 ms 647776 KB Output is correct
44 Correct 1025 ms 647680 KB Output is correct
45 Correct 1010 ms 647544 KB Output is correct
46 Correct 1014 ms 647504 KB Output is correct
47 Correct 1045 ms 647476 KB Output is correct
48 Correct 1025 ms 647488 KB Output is correct
49 Correct 994 ms 647516 KB Output is correct
50 Correct 1000 ms 647640 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 161 ms 538208 KB Output is correct
2 Correct 111 ms 538224 KB Output is correct
3 Correct 112 ms 538064 KB Output is correct
4 Correct 113 ms 538196 KB Output is correct
5 Correct 110 ms 538192 KB Output is correct
6 Correct 111 ms 538196 KB Output is correct
7 Correct 114 ms 538328 KB Output is correct
8 Correct 120 ms 538108 KB Output is correct
9 Correct 111 ms 538192 KB Output is correct
10 Correct 111 ms 538292 KB Output is correct
11 Correct 115 ms 538308 KB Output is correct
12 Correct 113 ms 538192 KB Output is correct
13 Correct 113 ms 538288 KB Output is correct
14 Correct 112 ms 538196 KB Output is correct
15 Correct 113 ms 538196 KB Output is correct
16 Correct 115 ms 538708 KB Output is correct
17 Correct 116 ms 538960 KB Output is correct
18 Correct 123 ms 538956 KB Output is correct
19 Correct 129 ms 541644 KB Output is correct
20 Correct 126 ms 541636 KB Output is correct
21 Correct 127 ms 541860 KB Output is correct
22 Correct 130 ms 542656 KB Output is correct
23 Correct 132 ms 542544 KB Output is correct
24 Correct 130 ms 542660 KB Output is correct
25 Correct 133 ms 542772 KB Output is correct
26 Correct 132 ms 542656 KB Output is correct
27 Correct 2043 ms 841716 KB Output is correct
28 Correct 2059 ms 839240 KB Output is correct
29 Correct 2095 ms 837512 KB Output is correct
30 Correct 2087 ms 845868 KB Output is correct
31 Correct 2181 ms 783564 KB Output is correct
32 Execution timed out 3101 ms 860612 KB Time limit exceeded
33 Halted 0 ms 0 KB -