ST 表 80 分 TLE 了两个点如何优化?
查看原帖
ST 表 80 分 TLE 了两个点如何优化?
502658
Ray662楼主2022/11/20 13:11

AC: \color{green}\texttt{AC: }#2 #3 #4 #5 #6 #7 #8 #9

TLE: \color{blue}\texttt{TLE: }#1 #10

#1 1.20ms

#10 1.09ms

#include <bits/stdc++.h>
#define ll long long
#define _for(i, a, b)  for (int i = (a); i <= (b); i ++ )
#define _all(i, a, b)  for (int i = (a); i >= (b); i -- )
using namespace std;
const int N = 1005;
int a, b, n, ans = 2e9, v[N][N], p_max[N][N][15], p_min[N][N][15];
// (x,y) (x+n-1,y) (x+n-1,y+n-1) (x,y+n-1)
inline int query_max(int x, int y) {
	int k = int(log2(n * 1.0)), ret = -2e9;
	_for (i, x, x + n - 1)  ret = max(ret, max(p_max[i][y][k], p_max[i][y + n - 1 - (1 << k) + 1][k]));
	return ret;
}
inline int query_min(int x, int y) {
	int k = int(log2(n * 1.0)), ret = 2e9;
	_for (i, x, x + n - 1)  ret = min(ret, min(p_min[i][y][k], p_min[i][y + n - 1 - (1 << k) + 1][k]));
	return ret;
}
int main() {
	ios :: sync_with_stdio(false), cin.tie(0), cout.tie(0);
	cin >> a >> b >> n;
	_for (i, 1, a)  _for (j, 1, b)  cin >> v[i][j], p_max[i][j][0] = p_min[i][j][0] = v[i][j];
	_for (P, 1, a)  for (int j = 1; (1 << j) <= b; j ++ )  _for (i, 1, b - (1 << (j - 1)))
		p_max[P][i][j] = max(p_max[P][i][j - 1], p_max[P][i + (1 << (j - 1))][j - 1]),
		p_min[P][i][j] = min(p_min[P][i][j - 1], p_min[P][i + (1 << (j - 1))][j - 1]);
	_for (i, 1, a - n + 1)  _for (j, 1, b - n + 1)  ans = min(ans, query_max(i, j) - query_min(i, j));
	cout << ans << endl;
	return 0;
}
2022/11/20 13:11
加载中...