제출 #1303476

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

// debug /*{{{*/
#define debug(...) __dbg(#__VA_ARGS__, __VA_ARGS__)

template<typename T, typename U> ostream& operator<< (ostream&, pair<T, U>);
template<typename...T> ostream& operator<< (ostream&, tuple<T...>);
template<typename T, size_t U> ostream& operator<< (ostream& out, array<T, U> i);
template<typename T, typename A> ostream& operator<< (ostream& out, vector<T, A> i);
template<typename T, typename A> ostream& operator<< (ostream& out, list<T, A> i);
template<typename T, typename A> ostream& operator<< (ostream& out, deque<T, A> i);
template<typename T, typename U, typename F> ostream& operator<< (ostream& out, priority_queue<T, U, F> i);
template<typename T, typename F, typename A> ostream& operator<< (ostream& out, set<T, F, A> i);
template<typename T, typename F, typename A> ostream& operator<< (ostream& out, multiset<T, F, A> i);
template<typename T> ostream& operator<< (ostream& out, unordered_set<T> i);
template<typename T, typename U, typename F, typename A> ostream& operator<< (ostream& out, map<T, U, F, A> i);
template<typename T, typename U> ostream& operator<< (ostream& out, unordered_map<T, U> i);

template<typename T, typename U>
ostream& operator<< (ostream& out, pair<T, U> i) {
	out << '(' << i.first << ' ' << i.second << ')';
	return out;
}

template<typename T, size_t...I>
void __write_tuple(const T& i, index_sequence<I...>) {
	(..., (cout << (I ? " " : "") << get<I>(i)));
}

template<typename...T>
void __write_tuples(tuple<T...> i) {
	__write_tuple(i, make_index_sequence<sizeof...(T)>());
}

template<typename...T>
ostream& operator<< (ostream& out, tuple<T...> i) {
	out << '('; __write_tuples(i); out << ')';
	return out;
}

template<typename T, size_t U>
ostream& operator<< (ostream& out, array<T, U> i) {
	bool f = 0;
	out << '(';
	for (auto i : i) { if (f) out << ' '; out << i; f = 1; }
	out << ')';
	return out;
}

template<typename T, typename A>
ostream& operator<< (ostream& out, vector<T, A> i) {
	bool f = 0;
	out << '(';
	for (auto i : i) { if (f) out << ' '; out << i; f = 1; }
	out << ')';
	return out;
}

template<typename T, typename A>
ostream& operator<< (ostream& out, list<T, A> i) {
	bool f = 0;
	out << '(';
	for (auto i : i) { if (f) out << ' '; out << i; f = 1; }
	out << ')';
	return out;
}

template<typename T, typename A>
ostream& operator<< (ostream& out, deque<T, A> i) {
	bool f = 0;
	out << '(';
	for (auto i : i) { if (f) out << ' '; out << i; f = 1; }
	out << ')';
	return out;
}

template<typename T, typename U, typename F>
ostream& operator<< (ostream& out, priority_queue<T, U, F> i) {
	bool f = 0;
	out << '(';
	while (i.size()) { if (f) out << ' '; out << i.top(); i.pop(); f = 1; }
	out << ')';
	return out;
}

template<typename T, typename F, typename A>
ostream& operator<< (ostream& out, set<T, F, A> i) {
	bool f = 0;
	out << '(';
	for (auto i : i) { if (f) out << ' '; out << i; f = 1; }
	out << ')';
	return out;
}

template<typename T, typename F, typename A>
ostream& operator<< (ostream& out, multiset<T, F, A> i) {
	bool f = 0;
	out << '(';
	for (auto i : i) { if (f) out << ' '; out << i; f = 1; }
	out << ')';
	return out;
}

template<typename T>
ostream& operator<< (ostream& out, unordered_set<T> i) {
	bool f = 0;
	out << '(';
	for (auto i : i) { if (f) out << ' '; out << i; f = 1; }
	out << ')';
	return out;
}

template<typename T, typename U, typename F, typename A>
ostream& operator<< (ostream& out, map<T, U, F, A> i) {
	bool f = 0;
	out << '(';
	for (auto i : i) { if (f) out << ' '; out << i; f = 1; }
	out << ')';
	return out;
}

template<typename T, typename U>
ostream& operator<< (ostream& out, unordered_map<T, U> i) {
	bool f = 0;
	out << '(';
	for (auto i : i) { if (f) out << ' '; out << i; f = 1; }
	out << ')';
	return out;
}

ostream& operator<< (ostream& out, __int128 n) {
	if (n < 0) out << '-', n = -n;
	string s;
	do s.push_back(n % 10 | 48); while (n /= 10);
	reverse(s.begin(), s.end());
	out << s;
	return out;
}

template<typename ...Args>
void __dbg(string s, Args&&... x) {
	string _;
	cout << '(' << s << ") : ";
	(..., (cout << _ << x, _ = ", "));
	cout << endl;
}
/*}}}*/

auto naive = [](int n, int m, int k, auto v) {
	auto f = [&](int i, int j) {
		auto [x1, y1] = v[i];
		auto [x2, y2] = v[j];
		auto c1 = [&](int x, int y) {
			return x1 <= x && x <= x1 + m && y1 - k <= y && y <= y1 + m + k;
		};
		auto c2 = [&](int x, int y) {
			return x1 - k <= x && x <= x1 + m + k && y1 <= y && y <= y1 + m;
		};
		if (c1(x2, y2)) return 1;
		if (c1(x2, y2 + m)) return 1;
		if (c1(x2 + m, y2)) return 1;
		if (c1(x2 + m, y2 + m)) return 1;
		if (c2(x2, y2)) return 1;
		if (c2(x2, y2 + m)) return 1;
		if (c2(x2 + m, y2)) return 1;
		if (c2(x2 + m, y2 + m)) return 1;
		return 0;
	};
	vector c(n, 0);
	auto rec = [&](const auto& self, int cur) -> void {
		c[cur] = 1;
		for (int nxt = 0; nxt < n; nxt++) {
			if (c[nxt]) continue;
			if (!f(cur, nxt)) continue;
			self(self, nxt);
		}
	};
	rec(rec, 0);
	int ret = 0;
	for (int i = 0; i < n; i++) {
		if (c[i] == 0) continue;
		ret = max(ret, v[i][0] + v[i][1] + 2 * m);
	}
	return ret;
};

auto sol = [](int n, int m, int k, auto v) {
	vector adj(n, vector(0, 0));
	for (int iter = 0; iter < 8; 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);
		}
		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;
			if (iter % 4 == 3) v[i][0] = -v[i][0] - m;
		}
	}
	vector c(n, 0);
	auto rec = [&](const auto& self, int cur) -> void {
		c[cur] = 1;
		for (int nxt : adj[cur]) {
			if (c[nxt]) continue;
			self(self, nxt);
		}
	};
	rec(rec, 0);
	int ret = 0;
	for (int i = 0; i < n; i++) {
		if (c[i] == 0) continue;
		ret = max(ret, v[i][0] + v[i][1] + 2 * m);
	}
	return ret;
};

// vgen /*{{{*/
auto gen_rand = [](int l, int r) {
	static mt19937 rd(0x814814);
	return uniform_int_distribution(l, r)(rd);
};

auto gen = [] {
	int lim = 50;
	int n = gen_rand(2, 20);
	int m = gen_rand(1, 4);
	int k = gen_rand(1, 2 * lim);
	vector v(1, array{ 0, 0 });
	while (v.size() < n) {
		int x = gen_rand(0, lim);
		int y = gen_rand(0, lim);
		int flag = 1;
		for (auto [px, py] : v) {
			auto c = [&](int x, int y) {
				return px <= x && x <= px + m && py <= y && y <= py + m;
			};
			if (c(x, y) || c(x, y + m) || c(x + m, y) || c(x + m, y + m)) flag = 0;
		}
		if (flag == 0) continue;
		v.push_back(array{ x, y });
	}
	return tuple(n, m, k, v);
};

auto test = [] {
	for (int iter = 0; iter < 100000; iter++) {
		if (iter % 1000 == 0) debug(iter);
		auto [n, m, k, v] = gen();
		auto r1 = naive(n, m, k, v);
		auto r2 = sol(n, m, k, v);
		if (r1 == r2) continue;
		debug(n, m, k);
		debug(v);
		debug(r1);
		debug(r2);
		break;
	}
	exit(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 << naive(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...