제출 #1303485

#제출 시각아이디문제언어결과실행 시간메모리
1303485jinhan814개구리 (KOI13_frog)C++20
19 / 19
387 ms23308 KiB
#include <bits/stdc++.h>
using namespace std;

auto sol = [](int n, int m, int k, auto v) {
	sort(v.begin(), v.end());
	vector adj(n, vector(0, 0));
	for (int iter = 0; iter < 4; iter++) {
		vector c(0, 0);
		for (int i = 0; i < n; i++) {
			c.push_back(v[i][0]);
			c.push_back(v[i][0] + m);
		}
		sort(c.begin(), c.end());
		c.erase(unique(c.begin(), c.end()), c.end());
		vector in(c.size(), vector(0, 0));
		vector out(c.size(), vector(0, 0));
		vector buc(c.size(), vector(0, 0));
		for (int i = 0; i < n; i++) {
			int p1 = lower_bound(c.begin(), c.end(), v[i][0]) - c.begin();
			int p2 = lower_bound(c.begin(), c.end(), v[i][0] + m) - c.begin();
			in[p1].push_back(i);
			out[p2].push_back(i);
			buc[p1].push_back(i);
			buc[p2].push_back(i);
		}
		set s{ pair(0, 0) }; s.clear();
		for (int x = 0; x < c.size(); x++) {
			for (int i : in[x]) {
				s.insert(pair(v[i][1] + m, i));
			}
			for (int i : buc[x]) {
				if (s.begin()->first >= v[i][1]) continue;
				auto it = prev(s.lower_bound(pair(v[i][1], -1)));
				if (it->first < v[i][1] - k) continue;
				int j = it->second;
				adj[i].push_back(j);
				adj[j].push_back(i);
			}
			for (int i : out[x]) {
				s.erase(pair(v[i][1] + m, i));
			}
		}
		for (int i = 0; i < n; i++) {
			swap(v[i][0], v[i][1]);
			v[i][1] = -v[i][1] - m;
		}
	}
	vector c(n, 0);
	auto rec = [&](const auto& self, int cur) -> int {
		c[cur] = 1;
		int ret = v[cur][0] + v[cur][1] + 2 * m;
		for (int nxt : adj[cur]) {
			if (c[nxt]) continue;
			ret = max(ret, self(self, nxt));
		}
		return ret;
	};
	return rec(rec, 0);
};

int main() {
	cin.tie(0)->sync_with_stdio(0);
	int n, m; cin >> n >> m;
	vector v(n, array{ 0, 0 });
	for (int i = 0; i < n; i++) cin >> v[i][0] >> v[i][1];
	int k; cin >> k;
	cout << sol(n, m, k, v) << '\n';
}
#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...