CF1993D 题解
Register_int · · 题解
一眼二分答案,将序列中
有个显然的
修改状态
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e6 + 10;
int T, n, m, a[MAXN], b[MAXN], dp[MAXN][2]; bool vis[MAXN][2];
int dfs(int x, int k) {
if (x < 0 || k < 0 || m * k > x) return -1e9;
if (!x) return 0; int t = k - (x - 1) / m;
if (vis[x][t]) return dp[x][t]; vis[x][t] = 1;
return dp[x][t] = max(dfs(x - 1, k) + b[x], dfs(x - m, k - 1));
}
inline
bool check(int x) {
for (int i = 1; i <= n; i++) b[i] = (a[i] >= x ? 1 : -1);
for (int i = 1; i <= n; i++) vis[i][0] = vis[i][1] = 0;
return dfs(n, (n - 1) / m) > 0;
}
int l, r, mid;
int main() {
for (scanf("%d", &T); T--;) {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
for (l = 1, r = 1e9; l < r; check(mid = l + r + 1 >> 1) ? l = mid : r = mid - 1);
printf("%d\n", l);
}
}