Submission #1296181

#TimeUsernameProblemLanguageResultExecution timeMemory
1296181am_aadvikGarden (JOI23_garden)C++20
6 / 100
3099 ms96244 KiB
#include <iostream>
#include<vector>
#include<set>
#include<chrono>
#include<random>
const int inf = 1e9;
using namespace std;

int n, m, d;
int solve(int x, int y, vector<pair<int, int>>& a, vector<pair<int, int>>& b) {
	vector<vector<vector<int>>> g(d, vector<vector<int>>(d, vector<int>(0)));
	int al = d, ar = 0, au = n, ad = 0;
	//o(d^2*(n+m)) To Be Optimized to o(d^2*m)
	for (int i = 0; i < d; ++i)
		for (int j = 0; j < d; ++j) {
			for (int k = 0; k < n; ++k) if ((((i + x) % d) == (a[k].first % d))
				&& (((j + y) % d) == (a[k].second % d))) g[i][j].push_back(k),
					al = min(al, j + y), ar = max(ar, j + y), au = min(au, i + x), ad = max(ad, i + x);
			for (int k = 0; k < m; ++k) if ((((i + x) % d) == (b[k].first % d))
				|| (((j + y) % d) == (b[k].second % d))) g[i][j].push_back(k + n);
		}
	//o(d^2*m)
	int ans = inf;
	for (int si = x; si <= au; ++si)
		for (int ei = max(si, ad); ei < (x + d); ++ei) {
			//row si to row di
			int sj = al, ej = ar;
			for (auto o : b) {
				int r = o.first % d;
				while (r < si) r += d;
				if (r > ei) {
					int c = o.second % d;
					while (c < y) c += d;
					sj = min(sj, c), ej = max(ej, c);
				}
			}
			int cur = (ej - sj + 1) * (ei - si + 1);
			ans = min(ans, cur);
		}
	return ans;
}
int mrand(int l, int r) {
	unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
	mt19937 g(seed);
	uniform_int_distribution<int> d(l, r);
	return d(g);
}
int main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	auto start_time = std::chrono::high_resolution_clock::now();
	cin >> n >> m >> d;
	vector<pair<int, int>> a(n);
	vector<pair<int, int>> b(m);
	for (auto& x : a) cin >> x.first >> x.second;
	for (auto& x : b) cin >> x.first >> x.second;

	int ans = inf;
	ans = min(ans, solve(0, 0, a, b));
	while(1) {
		auto end_time = std::chrono::high_resolution_clock::now();
		auto duration = end_time - start_time;
		long long t = std::chrono::duration_cast<std::chrono::milliseconds>(duration).count();
		if (t >= 2800) break;
		int x = mrand(0, d + d);
		int y = mrand(0, d + d);
		ans = min(ans, solve(x, y, a, b));
	}
	cout << ans;
}
#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...