이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#define int int64_t
const int inf = 2e18;
//const int mod = 1e9 + 7;
vector<int> dsu_p, dsu_sz;
vector<int> min_y, max_y;
vector<int> seg_l, seg_r;
set<pair<pair<int, int>, int>> segs;
vector<int> x;
int d;
int ans = 0;
int get_root(int v) {
if (dsu_p[v] == -1) {
return v;
}
return dsu_p[v] = get_root(dsu_p[v]);
}
void unite(int a, int b);
void check_seg(int v) {
v = get_root(v);
auto it = segs.find({{seg_l[v], seg_r[v]}, v});
vector<int> to_unite;
it++;
if (it != segs.end()) {
if (it->first.first - seg_r[v] <= d) {
to_unite.push_back(it->second);
}
}
it--;
if (it != segs.begin()) {
it--;
if (seg_l[v] - it->first.second <= d) {
to_unite.push_back(it->second);
}
it++;
}
for (int u: to_unite) {
unite(v, u);
}
}
void unite(int a, int b) {
a = get_root(a);
b = get_root(b);
if (a == b) {
return;
}
if (dsu_sz[a] > dsu_sz[b]) {
swap(a, b);
}
segs.erase({{seg_l[a], seg_r[a]}, a});
segs.erase({{seg_l[b], seg_r[b]}, b});
int l = a, r = b;
if (x[r] < x[l]) {
swap(l, r);
}
min_y[r] -= d * dsu_sz[l];
max_y[r] -= d * dsu_sz[l];
dsu_p[a] = b;
dsu_sz[b] += dsu_sz[a];
min_y[b] = min(min_y[b], min_y[a]);
max_y[b] = max(max_y[b], max_y[a]);
int y = (min_y[b] + max_y[b]) / 2;
seg_l[b] = y;
seg_r[b] = y + (dsu_sz[b] - 1) * d;
segs.insert({{seg_l[b], seg_r[b]}, b});
ans = max(ans, (max_y[b] - min_y[b]) / 2);
check_seg(b);
}
int32_t main() {
ios_base::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n, m;
cin >> n >> m >> d;
d *= 2;
dsu_p.resize(n + m, -1);
dsu_sz.resize(n + m, 1);
min_y.resize(n + m);
max_y.resize(n + m);
seg_l.resize(n + m);
seg_r.resize(n + m);
x.resize(n + m);
for (int i = 0; i < n + m; i++) {
cin >> x[i];
x[i] *= 2;
min_y[i] = max_y[i] = x[i];
seg_l[i] = seg_r[i] = x[i];
}
for (int i = 0; i < n + m; i++) {
segs.insert({{seg_l[i], seg_r[i]}, i});
check_seg(i);
if (i >= n) {
cout << ans / 2;
if (ans % 2) {
cout << ".5";
}
cout << ' ';
}
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |