This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
struct Node {
int mx_pref, mx_suff, mx_segm, len;
Node(int _len = 0, int _val = 0) {
mx_pref = mx_suff = mx_segm = _val;
len = _len;
}
Node operator+(Node b) {
Node ans;
ans.len = len + b.len;
if (mx_pref == len) {
ans.mx_pref = len + b.mx_pref;
} else {
ans.mx_pref = mx_pref;
}
if (b.mx_suff == b.len) {
ans.mx_suff = b.len + mx_suff;
} else {
ans.mx_suff = b.mx_suff;
}
ans.mx_segm = max(mx_suff + b.mx_pref, max(mx_segm, b.mx_segm));
return ans;
}
};
constexpr int R = 1 << 13;
Node tree[R * 2];
void build(int d) {
for (int i = 0; i < d; ++i) {
tree[i + R] = Node(1, 1);
}
for (int i = R - 1; i > 0; --i) {
tree[i] = tree[i * 2] + tree[i * 2 + 1];
}
}
void change(int pos, int val) {
pos += R;
tree[pos] = Node(1, val);
for (pos /= 2; pos > 0; pos /= 2) {
tree[pos] = tree[pos * 2] + tree[pos * 2 + 1];
}
}
void solve() {
int n, m, d;
cin >> n >> m >> d;
vector<int> p(n), q(n);
for (int i = 0; i < n; ++i) {
cin >> p[i] >> q[i];
}
vector<int> r(m), s(m);
for (int i = 0; i < m; ++i) {
cin >> r[i] >> s[i];
}
int ans = d * d;
if (m <= 8) {
vector<int> p_nw, q_nw;
for (int i = 0; i < n; ++i) {
p_nw.push_back(p[i]);
p_nw.push_back(p[i] + d);
q_nw.push_back(q[i]);
q_nw.push_back(q[i] + d);
}
sort(p_nw.begin(), p_nw.end());
sort(q_nw.begin(), q_nw.end());
for (int mask = 0; mask < (1 << m); ++mask) {
int mnx = d, mny = d;
for (int i = 0; i < d; ++i) {
int posx = lower_bound(p_nw.begin(), p_nw.end(), i) - p_nw.begin();
int rx = p_nw[posx + n - 1] + 1;
for (int j = 0; j < m; ++j) {
if (mask & (1 << j)) {
if (i <= r[j]) {
rx = max(rx, r[j] + 1);
} else {
rx = max(rx, r[j] + d + 1);
}
}
}
mnx = min(mnx, rx - i);
int posy = lower_bound(q_nw.begin(), q_nw.end(), i) - q_nw.begin();
int ry = q_nw[posy + n - 1] + 1;
for (int j = 0; j < m; ++j) {
if (!(mask & (1 << j))) {
if (i <= s[j]) {
ry = max(ry, s[j] + 1);
} else {
ry = max(ry, s[j] + d + 1);
}
}
}
mny = min(mny, ry - i);
}
ans = min(ans, mnx * mny);
}
} else {
vector<int> pp = p;
sort(pp.begin(), pp.end());
build(d);
vector<int> cnt(d);
for (int i = 0; i < n; ++i) {
cnt[q[i]]++;
if (cnt[q[i]] == 1) {
change(q[i], 0);
}
}
vector<int> inds(m);
iota(inds.begin(), inds.end(), 0);
sort(inds.begin(), inds.end(), [&](int i, int j) {
int ri = r[i] + 1, rj = r[j] + 1;
return ri < rj;
});
int pos = 0;
for (int lx = 0; lx < d; ++lx) {
int rx = pp[n - 1] + 1;
int pos = lower_bound(pp.begin(), pp.end(), lx) - pp.begin();
if (pos != 0) {
pos--;
rx = max(rx, pp[pos] + d + 1);
}
for (int i = 0; i < m; ++i) {
cnt[s[i]]++;
if (cnt[s[i]] == 1) {
change(s[i], 0);
}
}
for (int i = pos; i < m; ++i) {
ans = min(ans, (rx - lx) * (d - max(tree[1].mx_segm, tree[1].mx_pref + tree[1].mx_suff)));
if (lx <= r[inds[i]]) {
rx = max(rx, r[inds[i]] + 1);
} else {
rx = max(rx, r[inds[i]] + d + 1);
}
cnt[s[inds[i]]]--;
if (cnt[s[inds[i]]] == 0) {
change(s[inds[i]], 1);
}
}
for (int i = 0; i < pos; ++i) {
ans = min(ans, (rx - lx) * (d - max(tree[1].mx_segm, tree[1].mx_pref + tree[1].mx_suff)));
if (lx <= r[inds[i]]) {
rx = max(rx, r[inds[i]] + 1);
} else {
rx = max(rx, r[inds[i]] + d + 1);
}
cnt[s[inds[i]]]--;
if (cnt[s[inds[i]]] == 0) {
change(s[inds[i]], 1);
}
}
ans = min(ans, (rx - lx) * (d - max(tree[1].mx_segm, tree[1].mx_pref + tree[1].mx_suff)));
while (pos < m && r[inds[pos]] == lx) {
pos++;
}
}
}
cout << ans << '\n';
}
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int t = 1;
// cin >> t;
while (t--) {
solve();
}
return 0;
}
Compilation message (stderr)
garden.cpp: In function 'void solve()':
garden.cpp:121:13: warning: unused variable 'pos' [-Wunused-variable]
121 | int pos = 0;
| ^~~
# | 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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |