제출 #414150

#제출 시각아이디문제언어결과실행 시간메모리
414150600MihneaCultivation (JOI17_cultivation)C++17
15 / 100
233 ms524 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 300 + 7; const int INF = (int) 1e9 + 7; int dimx, dimy, n; struct point { int x; int y; }; bool operator < (point a, point b) { if (a.x != b.x) return a.x < b.x; return a.y < b.y; } point v[N]; struct Event { int when; int l, r; int coef; }; bool operator < (Event a, Event b) { if (a.when != b.when) return a.when < b.when; return a.coef < b.coef; } bool ok(int a, int b, int c, int d) { bool ok1 = 0, ok2 = 0; vector<Event> events; for (int i = 1; i <= n; i++) { int x1 = v[i].x - a, x2 = v[i].x + b; int y1 = v[i].y - c, y2 = v[i].y + d; x1 = max(x1, 1); x2 = min(x2, dimx); y1 = max(y1, 1); y2 = min(y2, dimy); events.push_back({x1, y1, y2, +1}); if (x2 < dimx) { events.push_back({x2 + 1, y1, y2, -1}); } ok1 |= (x1 == 1); ok2 |= (x2 == dimx); } sort(events.begin(), events.end()); if (!ok1 || !ok2) { return 0; } vector<pair<int, int>> intervals; for (int step = 0; step < (int) events.size(); step++) { auto it = events[step]; int l = it.l, r = it.r + 1; if (it.coef == 1) { intervals.push_back({l, r}); } else { pair<int, int> pr = {l, r}; for (auto &it : intervals) { if (it == pr) { swap(it, intervals.back()); } } assert(!intervals.empty()); assert(intervals.back() == pr); intervals.pop_back(); } if (step + 1 < (int) events.size() && events[step + 1].when == events[step].when) { continue; } sort(intervals.begin(), intervals.end()); bool good = 1; int last = 1; for (auto &it : intervals) { if (it.first > last) { good = 0; break; } last = max(last, it.second); } good &= (last == dimy + 1); if (!good) { return 0; } } return 1; } vector<int> cover[N]; signed main() { ios::sync_with_stdio(0); cin.tie(0); ///freopen ("input", "r", stdin); cin >> dimx >> dimy >> n; for (int i = 1; i <= n; i++) { cin >> v[i].x >> v[i].y; } if (dimx > 40) { return 0; } int sol = INF; for (int a = 0; a <= dimx; a++) { for (int b = 0; a + b <= dimx; b++) { /// fix north, south for (int i = 1; i <= dimx; i++) { cover[i].clear(); } for (int i = 1; i <= n; i++) { int l = max(1, v[i].x - a), r = min(dimx, v[i].x + b); for (int j = l; j <= r; j++) { cover[j].push_back(i); } } bool ok = 1; for (int i = 1; i <= dimx; i++) { if (cover[i].empty()) { ok = 0; break; } } if (!ok) { continue; } /// now it's a pretty easy task /// For each row I have some restrictions int r1 = 0, r2 = 0, rsum = 0; for (int i = 1; i <= dimx; i++) { vector<int> pts; for (auto &j : cover[i]) { pts.push_back(v[j].y); } sort(pts.begin(), pts.end()); r1 = max(r1, pts[0] - 1); r2 = max(r2, dimy - pts.back()); for (int j = 1; j < (int) pts.size(); j++) { rsum = max(rsum, pts[j] - pts[j - 1] - 1); } } rsum = max(rsum, r1 + r2); sol = min(sol, a + b + rsum); } } cout << sol << "\n"; return 0; /** int sol = INF; for (int a = 0; a <= dimx; a++) { for (int b = 0; b <= dimx; b++) { for (int c = 0; c <= dimy; c++) { for (int d = 0; d <= dimy; d++) { if (a + b + c + d >= sol) continue; if (ok(a, b, c, d)) { sol = a + b + c + d; } } } } } cout << sol << "\n"; **/ return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...