답안 #895455

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
895455 2023-12-30T00:56:03 Z MilosMilutinovic 원 고르기 (APIO18_circle_selection) C++14
37 / 100
3000 ms 860416 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 (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][a]);
}

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;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 114 ms 538404 KB Output is correct
2 Correct 111 ms 538196 KB Output is correct
3 Correct 113 ms 538196 KB Output is correct
4 Correct 111 ms 538196 KB Output is correct
5 Correct 114 ms 538380 KB Output is correct
6 Correct 110 ms 538296 KB Output is correct
7 Correct 112 ms 538192 KB Output is correct
8 Correct 118 ms 538048 KB Output is correct
9 Correct 124 ms 538380 KB Output is correct
10 Correct 111 ms 538196 KB Output is correct
11 Correct 111 ms 538304 KB Output is correct
12 Correct 111 ms 538308 KB Output is correct
13 Correct 112 ms 538184 KB Output is correct
14 Correct 113 ms 538192 KB Output is correct
15 Correct 112 ms 538160 KB Output is correct
16 Correct 120 ms 538672 KB Output is correct
17 Correct 114 ms 538964 KB Output is correct
18 Correct 114 ms 538892 KB Output is correct
19 Correct 125 ms 541524 KB Output is correct
20 Correct 125 ms 541460 KB Output is correct
21 Correct 125 ms 541524 KB Output is correct
22 Correct 134 ms 542584 KB Output is correct
23 Correct 135 ms 542544 KB Output is correct
24 Correct 134 ms 542664 KB Output is correct
25 Correct 133 ms 542752 KB Output is correct
26 Correct 135 ms 542608 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2141 ms 842480 KB Output is correct
2 Correct 2154 ms 839968 KB Output is correct
3 Correct 2217 ms 837052 KB Output is correct
4 Correct 2214 ms 844364 KB Output is correct
5 Correct 2352 ms 783240 KB Output is correct
6 Execution timed out 3075 ms 860416 KB Time limit exceeded
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 114 ms 538056 KB Output is correct
2 Correct 1261 ms 643960 KB Output is correct
3 Execution timed out 3061 ms 860076 KB Time limit exceeded
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3034 ms 859232 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 114 ms 538404 KB Output is correct
2 Correct 111 ms 538196 KB Output is correct
3 Correct 113 ms 538196 KB Output is correct
4 Correct 111 ms 538196 KB Output is correct
5 Correct 114 ms 538380 KB Output is correct
6 Correct 110 ms 538296 KB Output is correct
7 Correct 112 ms 538192 KB Output is correct
8 Correct 118 ms 538048 KB Output is correct
9 Correct 124 ms 538380 KB Output is correct
10 Correct 111 ms 538196 KB Output is correct
11 Correct 111 ms 538304 KB Output is correct
12 Correct 111 ms 538308 KB Output is correct
13 Correct 112 ms 538184 KB Output is correct
14 Correct 113 ms 538192 KB Output is correct
15 Correct 112 ms 538160 KB Output is correct
16 Correct 120 ms 538672 KB Output is correct
17 Correct 114 ms 538964 KB Output is correct
18 Correct 114 ms 538892 KB Output is correct
19 Correct 125 ms 541524 KB Output is correct
20 Correct 125 ms 541460 KB Output is correct
21 Correct 125 ms 541524 KB Output is correct
22 Correct 134 ms 542584 KB Output is correct
23 Correct 135 ms 542544 KB Output is correct
24 Correct 134 ms 542664 KB Output is correct
25 Correct 133 ms 542752 KB Output is correct
26 Correct 135 ms 542608 KB Output is correct
27 Correct 154 ms 545744 KB Output is correct
28 Correct 148 ms 545968 KB Output is correct
29 Correct 147 ms 546132 KB Output is correct
30 Correct 160 ms 547260 KB Output is correct
31 Correct 160 ms 547400 KB Output is correct
32 Correct 172 ms 547220 KB Output is correct
33 Correct 680 ms 626076 KB Output is correct
34 Correct 717 ms 632780 KB Output is correct
35 Correct 741 ms 635524 KB Output is correct
36 Correct 1209 ms 644552 KB Output is correct
37 Correct 1185 ms 644416 KB Output is correct
38 Correct 1225 ms 644024 KB Output is correct
39 Correct 619 ms 576716 KB Output is correct
40 Correct 621 ms 576928 KB Output is correct
41 Correct 622 ms 576204 KB Output is correct
42 Correct 561 ms 585088 KB Output is correct
43 Correct 1143 ms 647604 KB Output is correct
44 Correct 1133 ms 647508 KB Output is correct
45 Correct 1155 ms 647628 KB Output is correct
46 Correct 1096 ms 647484 KB Output is correct
47 Correct 1179 ms 647480 KB Output is correct
48 Correct 1188 ms 647588 KB Output is correct
49 Correct 1163 ms 647396 KB Output is correct
50 Correct 1170 ms 647628 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 114 ms 538404 KB Output is correct
2 Correct 111 ms 538196 KB Output is correct
3 Correct 113 ms 538196 KB Output is correct
4 Correct 111 ms 538196 KB Output is correct
5 Correct 114 ms 538380 KB Output is correct
6 Correct 110 ms 538296 KB Output is correct
7 Correct 112 ms 538192 KB Output is correct
8 Correct 118 ms 538048 KB Output is correct
9 Correct 124 ms 538380 KB Output is correct
10 Correct 111 ms 538196 KB Output is correct
11 Correct 111 ms 538304 KB Output is correct
12 Correct 111 ms 538308 KB Output is correct
13 Correct 112 ms 538184 KB Output is correct
14 Correct 113 ms 538192 KB Output is correct
15 Correct 112 ms 538160 KB Output is correct
16 Correct 120 ms 538672 KB Output is correct
17 Correct 114 ms 538964 KB Output is correct
18 Correct 114 ms 538892 KB Output is correct
19 Correct 125 ms 541524 KB Output is correct
20 Correct 125 ms 541460 KB Output is correct
21 Correct 125 ms 541524 KB Output is correct
22 Correct 134 ms 542584 KB Output is correct
23 Correct 135 ms 542544 KB Output is correct
24 Correct 134 ms 542664 KB Output is correct
25 Correct 133 ms 542752 KB Output is correct
26 Correct 135 ms 542608 KB Output is correct
27 Correct 2141 ms 842480 KB Output is correct
28 Correct 2154 ms 839968 KB Output is correct
29 Correct 2217 ms 837052 KB Output is correct
30 Correct 2214 ms 844364 KB Output is correct
31 Correct 2352 ms 783240 KB Output is correct
32 Execution timed out 3075 ms 860416 KB Time limit exceeded
33 Halted 0 ms 0 KB -