求助
查看原帖
求助
875897
lucktains楼主2024/6/13 13:17

记录

#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, m, a, b, ar[511][511], sans = LLONG_MAX;

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> n >> m >> a >> b;
	if (a > b)
		swap(a, b);
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			cin >> ar[i][j];
			ar[i][j] += ar[i - 1][j] + ar[i][j - 1] - ar[i - 1][j - 1];
		}
	}
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			int l = i, r = n, ans = LLONG_MAX, cm = 0;
			while (l <= r) {
				int mid = l + r >> 1, cmp;
				int l1 = j, r1 = m;
				while (l1 <= r1) {
					int mid1 = l1 + r1 >> 1;
					int x = ar[mid][mid1] - ar[mid][j - 1] - ar[i - 1][mid1] + ar[i - 1][j - 1];
					ans = min(ans, abs(x - a) + abs(x - b));
					if (x < a) {
						l1 = mid1 + 1;
						cmp = 1;
					} else if (x > b) {
						r1 = mid1 - 1;
						cmp = 2;
					} else {
						// ans = min(ans, b - a);
						cmp = 3;
						break;
					}
				}
				if (cmp == 1) {
					l = mid + 1;
				} else if (cmp == 2) {
					r = mid - 1;
				} else {
					cm = 1;
					break;
				}
			}
			l = j, r = m, cm = 0;
			while (l <= r) {
				int mid = l + r >> 1, cmp;
				int l1 = i, r1 = n;
				while (l1 <= r1) {
					int mid1 = l1 + r1 >> 1;
					int x = ar[mid1][mid] - ar[mid1][j - 1] - ar[i - 1][mid] + ar[i - 1][j - 1];
					ans = min(ans, abs(x - a) + abs(x - b));
					if (x < a) {
						l1 = mid1 + 1;
						cmp = 1;
					} else if (x > b) {
						r1 = mid1 - 1;
						cmp = 2;
					} else {
						// ans = min(ans, b - a);
						cmp = 3;
						break;
					}
				}
				if (cmp == 1) {
					l = mid + 1;
				} else if (cmp == 2) {
					r = mid - 1;
				} else {
					cm = 1;
					break;
				}
			}
			sans = min(sans, ans);
			if (cm) {
				cout << b - a;
				return 0;
			}
		}
	}
	cout << sans;
	return 0;
}
2024/6/13 13:17
加载中...