# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
113852 | Bruteforceman | Cultivation (JOI17_cultivation) | C++11 | 10 ms | 512 KiB |
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;
typedef pair <int, int> pii;
int R, C;
int x[305], y[305];
int n;
const int inf = 1e9 + 7;
vector <int> beg[605], fin[605];
int getOpt(int len) {
// cout << len << endl;
int mnX = inf;
int mxX = -inf;
for(int i = 1; i <= n; i++) {
mnX = min(mnX, x[i]);
mxX = max(mxX, x[i] + len);
}
set <pii> endp;
map <int, int> com;
for(int i = 1; i <= n; i++) {
int l = x[i];
int r = x[i] + len;
if(l > mnX) {
endp.insert(pii(l - 1, 1));
}
if(r < mxX) {
endp.insert(pii(r + 1, -1));
}
endp.insert(pii(l, -1));
endp.insert(pii(r, 1));
com[l]; com[r];
}
vector <pii> v (endp.begin(), endp.end());
int idx = 0;
for(auto &i : com) {
i.second = ++idx;
}
for(int i = 0; i <= idx; i++) {
beg[i].clear(); fin[i].clear();
}
for(int i = 1; i <= n; i++) {
int l = x[i];
int r = x[i] + len;
beg[com[l]].push_back(i);
fin[com[r]].push_back(i);
}
multiset <int> s;
multiset <int> diff;
vector <int> sz, val;
for(int i = 1; i < v.size(); i += 2) {
int l = v[i - 1].first;
int r = v[i].first;
int cmpL = com[l];
int cmpR = com[r];
for(auto j : beg[cmpL]) {
s.insert(y[j]);
auto it = s.lower_bound(y[j]);
int prev = -1;
int nxt = -1;
if(it != s.begin()) {
prev = *(--it);
++it;
}
++it;
if(it != s.end()) {
nxt = *it;
}
if(prev != -1) {
diff.insert(y[j] - prev);
}
if(nxt != -1) {
diff.insert(nxt - y[j]);
}
if(prev != -1 && nxt != -1) {
diff.erase(diff.find(nxt - prev));
}
}
sz.push_back(r - l + 1);
if(s.empty()) {
val.push_back(inf);
} else {
int opt = C - (*s.rbegin() - *s.begin() + 1);
if(!diff.empty()) {
opt = max(opt, *diff.rbegin() - 1);
}
val.push_back(opt);
}
for(auto j : fin[cmpR]) {
auto it = s.lower_bound(y[j]);
int prev = -1;
int nxt = -1;
if(it != s.begin()) {
prev = *(--it);
++it;
}
++it;
if(it != s.end()) {
nxt = *it;
}
if(prev != -1) {
diff.erase(diff.find(y[j] - prev));
}
if(nxt != -1) {
diff.erase(diff.find(nxt - y[j]));
}
if(prev != -1 && nxt != -1) {
diff.insert(nxt - prev);
}
s.erase(s.find(y[j]));
}
}
multiset <int> cont;
int r = 0;
int sum = 0;
int prev = 0;
int ans = inf;
for(int i = 0; i < sz.size(); i++) {
if(prev > len + 1) break;
while(r < sz.size() && sum < R) {
sum += sz[r];
cont.insert(val[r]);
++r;
}
if(sum >= R) {
ans = min(ans, *cont.rbegin());
}
prev += sz[i];
sum -= sz[i];
cont.erase(cont.find(val[i]));
}
return ans;
}
int main(int argc, char const *argv[])
{
scanf("%d %d", &R, &C);
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
scanf("%d %d", &x[i], &y[i]);
}
int ans = getOpt(0);
for(int i = 1; i <= n; i++) {
for(int j = i + 1; j <= n; j++) {
int dif = abs(x[j] - x[i]) - 1;
if(dif >= 0) {
ans = min(ans, getOpt(dif) + dif);
}
dif = R - abs(x[j] - x[i]) - 1;
if(dif >= 0) {
ans = min(ans, getOpt(dif) + dif);
}
}
}
printf("%d\n", ans);
return 0;
}
Compilation message (stderr)
# | 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... |