st表求调!!!
  • 板块P10059 Choose
  • 楼主666wula666
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/1/19 18:53
  • 上次更新2024/1/19 18:54:27
查看原帖
st表求调!!!
882793
666wula666楼主2024/1/19 18:53
#include <bits/stdc++.h>

#define int long long
using namespace std;
const int N = 100010;
int stmin[N][32], stmax[N][32];
int a[N];
int ans = 0x3f3f3f3f;

int n, k;
int qmax(int l, int r) {
	int len = log2(r - l + 1);
	return max(stmax[l][len], stmax[r - (1 << len) + 1][len]);

}
int qmin(int l, int r) {
	int len = log2(r - l + 1);
	return min(stmin[l][len], stmin[r - (1 << len) + 1][len]);

}
bool check(int x) {
	int kk = 0;
	for (int i = 1; i <= n - x + 1; i++) {
		if (qmax(i, i + x - 1) - qmin(i, i + x - 1) >= ans)kk++;
		if (kk == k)return true;
	}
	return false;
}
signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin >> t;
	while (t--) {
		cin >> n >> k;

		for (int i = 1; i <= n; i++) {
			cin >> stmin[i][0];
			a[i] = stmin[i][0];
			stmax[i][0] = stmin[i][0];
		}


		for (int j = 1; (1 << j) <= n; j++) { //总包含数字不超过n
			for (int i = 1; i + (1 << j) - 1 <= n; i++) { //确保是子区间,不越界
				stmin[i][j] = min(stmin[i][j - 1], stmin[i + (1 << j - 1)][j - 1]);
				stmax[i][j] = max(stmax[i][j - 1], stmax[i + (1 << j - 1)][j - 1]);
			}
		}

		for (int i = 1; i <= k; i++) {
			ans = min(qmax(i, n - k + i) - qmin(i, n - k + i), ans);
		}

		int l = 1, r = n - k + 1;

		while (l <= r) {

			int mid = (l + r) >> 1 ;
			if (check(mid))r = mid - 1;
			else l = mid + 1;
		}

		cout << ans << ' ' << l << endl;


	}
}
2024/1/19 18:53
加载中...