Submission #505879

#TimeUsernameProblemLanguageResultExecution timeMemory
505879MazaalaiChessboard (IZhO18_chessboard)C++17
100 / 100
636 ms2800 KiB
#include <bits/stdc++.h>
#define pb push_back
using namespace std;
using ll = long long;
using PII = pair <int, int>;
const ll INF = 1e18;
const int N = 1e5 + 5;
ll n, m, ans = INF;
vector <int> divs;
ll dp[N];
void add(int num) {
	if (num == n) return;
	divs.pb(num);
	ll len = n / num;
	dp[num] = (len * len + 1) / 2 * num * num;
}
int getCnt(int pos, int len) {
	int full = pos - (pos % len);
	int ret = (full / len + 1) / 2 * len;
	if ((full / len) % 2 == 0) ret += pos - full;
	return ret;
}
signed main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	// freopen("in.txt", "r", stdin);
	// freopen("out.txt", "w", stdout);
	cin >> n >> m;
	for (int i = 1; i * i <= n; i++) {
		if (n % i != 0) continue;
		add(i);
		if (i * i != n) add(n / i);
	}
	for (int i = 0; i < m; i++) {
		int a1, b1, a2, b2; cin >> a1 >> b1 >> a2 >> b2;
		for (auto& num : divs) {
			int black, white, Black, White;
			black = getCnt(a2, num) - getCnt(a1-1, num);
			white = a2 - a1 + 1 - black;
			Black = getCnt(b2, num) - getCnt(b1-1, num);
			White = b2 - b1 + 1 - Black;
			ll cur = black - white, cur1 = -cur;
			dp[num] -= cur * Black + cur1 * White;
			// cout << a1 << ' ' << b1 << ' ' << num << " : " << cur * Black + cur1 * White << '\n';
		}
	}
	for (auto& num : divs) {
		// cout << num << ": " << dp[num] << '\n';
		ans = min(ans, min(dp[num], n * n - dp[num]));
	}
	cout << ans << '\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...