답안 #801601

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
801601 2023-08-02T06:50:56 Z GEN 이지후(#10129) Cultivation (JOI17_cultivation) C++17
0 / 100
3 ms 340 KB
#include <bits/stdc++.h>
using namespace std;
using lint = long long;
using pi = array<lint, 2>;
#define sz(v) ((int)(v).size())
#define all(v) (v).begin(), (v).end()

lint sumFixed(lint r, lint c, lint g, vector<pi> a) {
	vector<array<lint, 3>> event;
	for (auto &[x, y] : a) {
		event.push_back({x, y, +1});
		event.push_back({x + 1 + g, y, -1});
	}
	event.push_back({0, -1, 0});
	event.push_back({r + g, -1, 0});
	sort(all(event));
	multiset<lint> s;
	vector<array<lint, 4>> chop;
	vector<lint> crd;
	for (int i = 0; i < sz(event);) {
		int j = i;
		while (j < sz(event) && event[i][0] == event[j][0]) {
			if (event[j][2] == +1)
				s.insert(event[j][1]);
			else if (event[j][2] == -1)
				s.erase(s.find(event[j][1]));
			j++;
		}
		if (j == sz(event))
			break;
		lint lmax = 0, rmax = 0, lrmax = 0;
		if (sz(s) == 0) {
			lmax = 1e18;
			rmax = 1e18;
		} else {
			lmax = max(lmax, *s.begin());
			rmax = max(rmax, c - 1 - *s.rbegin());
			{
				auto it = s.begin();
				while (next(it) != s.end()) {
					lrmax = max(lrmax, *next(it) - *it - 1);
					it++;
				}
			}
		}
		chop.push_back({event[i][0], event[j][0], lmax + rmax, lrmax});
		crd.push_back(min(g, event[i][0]));
		crd.push_back(max(0ll, event[j][0] - r));
		i = j;
	}
	sort(all(crd));
	crd.resize(unique(all(crd)) - crd.begin());
	int k = 0;
	priority_queue<pi> pq1, pq2;
	lint ans = 1e18;
	for (auto &x : crd) {
		while (k < sz(chop) && chop[k][0] < x + r) {
			pq1.push({chop[k][2], chop[k][1]});
			pq2.push({chop[k][3], chop[k][1]});
			k++;
		}
		while (sz(pq1) && pq1.top()[1] <= x)
			pq1.pop();
		while (sz(pq2) && pq2.top()[1] <= x)
			pq2.pop();
		ans = min(ans, max(pq1.top()[0], pq2.top()[0]));
	}
	return ans;
}

map<pi, lint> mp;
lint solve(lint r, lint c, lint dl, lint dr, vector<pi> a) {
	if (mp.count({dl, dr}))
		return mp[pi{dl, dr}];
	vector<array<lint, 3>> event;
	for (auto &[x, y] : a) {
		int l = max(0ll, x - dl);
		int e = min(r * 1ll, x + 1 + dr);
		event.push_back({l, y, +1});
		event.push_back({e, y, -1});
	}
	sort(all(event));
	if (event[0][0] != 0 || event.back()[0] != r)
		return mp[pi{dl, dr}] = 1e18;
	lint lmax = 0, rmax = 0, lrmax = 0;
	multiset<lint> s;
	for (int i = 0; i < sz(event);) {
		int j = i;
		while (j < sz(event) && event[i][0] == event[j][0]) {
			if (event[j][2] == +1)
				s.insert(event[j][1]);
			else
				s.erase(s.find(event[j][1]));
			j++;
		}
		if (j == sz(event))
			break;
		if (sz(s) == 0)
			return mp[pi{dl, dr}] = 1e18;
		lmax = max(lmax, *s.begin());
		rmax = max(rmax, c - 1 - *s.rbegin());
		{
			auto it = s.begin();
			while (next(it) != s.end()) {
				lrmax = max(lrmax, *next(it) - *it - 1);
				it++;
			}
		}
		i = j;
	}
	return mp[pi{dl, dr}] = max(lmax + rmax, lrmax);
}

// n^4

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n, r, c;
	cin >> r >> c >> n;
	vector<pi> a(n);
	for (auto &[x, y] : a)
		cin >> x >> y, x--, y--;
	sort(all(a));
	lint ans = 1e18;
	vector<lint> gaps = {0};
	for (int i = 0; i < n; i++) {
		for (int j = i + 1; j < n; j++) {
			if (a[j][0] > a[i][0])
				gaps.push_back(a[j][0] - a[i][0] - 1);
		}
	}
	sort(all(gaps));
	gaps.resize(unique(all(gaps)) - gaps.begin());
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			ans = min(ans, a[i][0] + r - 1 - a[j][0] + solve(r, c, a[i][0], r - 1 - a[j][0], a));
		}
	}
	for (auto &dy : gaps) {
		ans = min(ans, sumFixed(r, c, dy, a) + dy);
	}
	cout << ans << endl;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Incorrect 1 ms 256 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Incorrect 1 ms 256 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Incorrect 1 ms 256 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 3 ms 340 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 3 ms 340 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Incorrect 1 ms 256 KB Output isn't correct
6 Halted 0 ms 0 KB -