一个问题(水
  • 板块灌水区
  • 楼主封禁用户
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/26 22:18
  • 上次更新2024/7/27 08:47:42
查看原帖
一个问题(水
1001535
封禁用户楼主2024/7/26 22:18
#include <bits/stdc++.h>
using namespace std;
const int N = 5e3 + 1;
const int inff = 1e18 + 1;
int n, q;
unsigned long long seed, b;
int e[N][N], e_[N][N];
int f[N][N], f1[N][N];
int ans;
inline int read() {
	int x = 0, f = 1;
	char c = getchar();
	while (c < '0' || c > '9') {
		if (c == '-') f = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
	return x * f;
}

void xorshift64() {
	seed ^= seed << 13;
	seed ^= seed >> 7;
	seed ^= seed << 17;
}

void build() {
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j < n; j++) {
			xorshift64();
			e[i][j] = seed & ((1 << b) - 1);
		}
	}
	for (int i = 1; i < n; i++) {
		for (int j = 1; j <= n; j++) {
			xorshift64();
			e_[i][j] = seed & ((1 << b) - 1);
		}
	}
}

void solve() {
	for (int i = 1; i <= n; i++) f[i][0] = f[0][i] = inff;
	f[0][1] = 0;
	for (int i = 2; i <= n; i++) f[1][i] = f[1][i - 1] + e[1][i - 1];
	for (int i = 2; i <= n; i++) f[i][1] = f[i - 1][1] + e_[i - 1][1];
	for (int i = 2; i <= n; i++) {
		for (int j = 2; j <= n; j++) {
			f[i][j] = min(f[i][j - 1] + e[i][j - 1], f[i - 1][j] + e_[i - 1][j]);
		}
	}
//	for (int i = 2; i <= n; i++) {
//			for (int j = 2; j <= n; j++) {
//			cout << f[i][j] << endl;
//			}
	for (int i = 1; i <= n; i++) f1[n + 1][i] = f1[i][n + 1] = inff;
	f1[n + 1][n] = 0;
//		}
	for (int i = n - 1; i >= 1; i--) f1[n][i] = f1[n][i + 1] + e[n][i];
	for (int i = n - 1; i >= 1; i--) f1[i][n] = f1[i + 1][n] + e_[i][n];
	for (int i = n; i >= 1; i--) {
		for (int j = n; j >= 1; j--) {
			f1[i][j] = min(f1[i][j + 1] + e[i][j], f1[i + 1][j] + e_[i][j]);
		}
	}
//	for (int i = n - 1; i >= 1; i--) {
//			for (int j = n - 1; j >= 1; j--) {
//				cout << f1[i][j] << endl;
//			}
}

signed main() {
	ios::sync_with_stdio(0), cin.tie(nullptr), cout.tie(nullptr);
	n = read(), q = read();
	seed = read(), b = read();
//	cin >> seed >> b;
	build();
	solve();
	for (int i = 1; i <= q; i++) {
		int x, y, x_, y_;
		ans = inff;
		x = read(), y = read(), x_ = read(), y_ = read();
//		cin >> x >> y >> x_ >> y_;
		if (x == x_) {
			for (int i = 1; i <= n; i++) {
				if (i != x) {
					ans = min(ans, f[i][y] + e[i][y] + f1[i][y_]);
				}
			}
		}
		if (y == y_) {
			for (int i = 1; i <= n; i++) {
				if (i != y) {
					ans = min(ans, f[x][i] + e_[x][i] + f1[x_][i]);
				}
			}
		}
		cout << ans << '\n';
	}
	return 0;
}

这个代码如何预处理呀(顺便问一下,预处理时什么?

2024/7/26 22:18
加载中...