Submission #895448

# Submission time Handle Problem Language Result Execution time Memory
895448 2023-12-30T00:44:51 Z MilosMilutinovic Circle selection (APIO18_circle_selection) C++14
37 / 100
3000 ms 862284 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 low = 0, high = (int) vec[x].size() - 1, idx = high + 1;
  while (low <= high) {
    int mid = low + high >> 1;
    if (vec[x][mid].first >= L) {
      idx = mid;
      high = mid - 1;
    } else {
      low = mid + 1;
    }
  }
  //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;
}

Compilation message

circle_selection.cpp: In function 'void Add(int, long long int, long long int)':
circle_selection.cpp:76:19: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   76 |     int mid = low + high >> 1;
      |               ~~~~^~~~~~
# Verdict Execution time Memory Grader output
1 Correct 180 ms 538276 KB Output is correct
2 Correct 113 ms 538224 KB Output is correct
3 Correct 112 ms 538192 KB Output is correct
4 Correct 116 ms 538208 KB Output is correct
5 Correct 114 ms 538312 KB Output is correct
6 Correct 114 ms 538180 KB Output is correct
7 Correct 115 ms 538196 KB Output is correct
8 Correct 115 ms 538192 KB Output is correct
9 Correct 112 ms 538192 KB Output is correct
10 Correct 112 ms 538296 KB Output is correct
11 Correct 113 ms 538100 KB Output is correct
12 Correct 112 ms 538340 KB Output is correct
13 Correct 116 ms 538192 KB Output is correct
14 Correct 114 ms 538224 KB Output is correct
15 Correct 112 ms 538192 KB Output is correct
16 Correct 113 ms 538744 KB Output is correct
17 Correct 115 ms 538960 KB Output is correct
18 Correct 114 ms 538952 KB Output is correct
19 Correct 126 ms 541520 KB Output is correct
20 Correct 124 ms 541520 KB Output is correct
21 Correct 126 ms 541756 KB Output is correct
22 Correct 130 ms 542544 KB Output is correct
23 Correct 131 ms 542548 KB Output is correct
24 Correct 131 ms 542708 KB Output is correct
25 Correct 130 ms 542776 KB Output is correct
26 Correct 133 ms 542724 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2153 ms 841220 KB Output is correct
2 Correct 2185 ms 841724 KB Output is correct
3 Correct 2168 ms 837320 KB Output is correct
4 Correct 2214 ms 846448 KB Output is correct
5 Correct 2202 ms 785224 KB Output is correct
6 Execution timed out 3097 ms 862260 KB Time limit exceeded
7 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 114 ms 538048 KB Output is correct
2 Correct 1258 ms 644948 KB Output is correct
3 Execution timed out 3096 ms 862284 KB Time limit exceeded
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 3091 ms 860564 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 180 ms 538276 KB Output is correct
2 Correct 113 ms 538224 KB Output is correct
3 Correct 112 ms 538192 KB Output is correct
4 Correct 116 ms 538208 KB Output is correct
5 Correct 114 ms 538312 KB Output is correct
6 Correct 114 ms 538180 KB Output is correct
7 Correct 115 ms 538196 KB Output is correct
8 Correct 115 ms 538192 KB Output is correct
9 Correct 112 ms 538192 KB Output is correct
10 Correct 112 ms 538296 KB Output is correct
11 Correct 113 ms 538100 KB Output is correct
12 Correct 112 ms 538340 KB Output is correct
13 Correct 116 ms 538192 KB Output is correct
14 Correct 114 ms 538224 KB Output is correct
15 Correct 112 ms 538192 KB Output is correct
16 Correct 113 ms 538744 KB Output is correct
17 Correct 115 ms 538960 KB Output is correct
18 Correct 114 ms 538952 KB Output is correct
19 Correct 126 ms 541520 KB Output is correct
20 Correct 124 ms 541520 KB Output is correct
21 Correct 126 ms 541756 KB Output is correct
22 Correct 130 ms 542544 KB Output is correct
23 Correct 131 ms 542548 KB Output is correct
24 Correct 131 ms 542708 KB Output is correct
25 Correct 130 ms 542776 KB Output is correct
26 Correct 133 ms 542724 KB Output is correct
27 Correct 151 ms 545796 KB Output is correct
28 Correct 147 ms 545968 KB Output is correct
29 Correct 145 ms 546116 KB Output is correct
30 Correct 158 ms 547280 KB Output is correct
31 Correct 161 ms 547280 KB Output is correct
32 Correct 159 ms 547208 KB Output is correct
33 Correct 674 ms 626544 KB Output is correct
34 Correct 697 ms 633292 KB Output is correct
35 Correct 711 ms 636000 KB Output is correct
36 Correct 1157 ms 644812 KB Output is correct
37 Correct 1127 ms 644964 KB Output is correct
38 Correct 1137 ms 644540 KB Output is correct
39 Correct 569 ms 576864 KB Output is correct
40 Correct 575 ms 576968 KB Output is correct
41 Correct 578 ms 576660 KB Output is correct
42 Correct 551 ms 585420 KB Output is correct
43 Correct 1089 ms 648396 KB Output is correct
44 Correct 1086 ms 648008 KB Output is correct
45 Correct 1084 ms 648056 KB Output is correct
46 Correct 1083 ms 647920 KB Output is correct
47 Correct 1130 ms 648000 KB Output is correct
48 Correct 1033 ms 648140 KB Output is correct
49 Correct 1039 ms 648036 KB Output is correct
50 Correct 1039 ms 648248 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 180 ms 538276 KB Output is correct
2 Correct 113 ms 538224 KB Output is correct
3 Correct 112 ms 538192 KB Output is correct
4 Correct 116 ms 538208 KB Output is correct
5 Correct 114 ms 538312 KB Output is correct
6 Correct 114 ms 538180 KB Output is correct
7 Correct 115 ms 538196 KB Output is correct
8 Correct 115 ms 538192 KB Output is correct
9 Correct 112 ms 538192 KB Output is correct
10 Correct 112 ms 538296 KB Output is correct
11 Correct 113 ms 538100 KB Output is correct
12 Correct 112 ms 538340 KB Output is correct
13 Correct 116 ms 538192 KB Output is correct
14 Correct 114 ms 538224 KB Output is correct
15 Correct 112 ms 538192 KB Output is correct
16 Correct 113 ms 538744 KB Output is correct
17 Correct 115 ms 538960 KB Output is correct
18 Correct 114 ms 538952 KB Output is correct
19 Correct 126 ms 541520 KB Output is correct
20 Correct 124 ms 541520 KB Output is correct
21 Correct 126 ms 541756 KB Output is correct
22 Correct 130 ms 542544 KB Output is correct
23 Correct 131 ms 542548 KB Output is correct
24 Correct 131 ms 542708 KB Output is correct
25 Correct 130 ms 542776 KB Output is correct
26 Correct 133 ms 542724 KB Output is correct
27 Correct 2153 ms 841220 KB Output is correct
28 Correct 2185 ms 841724 KB Output is correct
29 Correct 2168 ms 837320 KB Output is correct
30 Correct 2214 ms 846448 KB Output is correct
31 Correct 2202 ms 785224 KB Output is correct
32 Execution timed out 3097 ms 862260 KB Time limit exceeded
33 Halted 0 ms 0 KB -