5分求调
  • 板块P10059 Choose
  • 楼主I_AK_CTS
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/1/21 07:22
  • 上次更新2024/1/21 11:36:48
查看原帖
5分求调
643818
I_AK_CTS楼主2024/1/21 07:22
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 5;
int a[N];
int n, k;
int qmin[N], qmax[N], h1, t1, h2, t2;
int mn;
bool check(int x, int ans) {
    h1 = 1, t1 = 0, h2 = 1, t2 = 0;
    for (int i = 1; i <= x; i++) {
        while (h1 <= t1 && a[i] <= a[qmin[t1]]) t1--;
        qmin[++t1] = i;
        while (h2 <= t2 && a[i] >= a[qmax[t2]]) t2--;
        qmax[++t2] = i;
    }
    bool flag = false;
    mn = LONG_LONG_MAX;
    if (a[qmax[h2]] - a[qmin[h1]] >= ans) mn = min(mn, a[qmax[h2]] - a[qmin[h1]]), flag = true;
    for (int i = x + 1; i <= n; i++) {
        while (h1 <= t1 && qmin[h1] <= i - x) h1++;
        while (h1 <= t1 && a[i] <= a[qmin[t1]]) t1--;
        qmin[++t1] = i;
        while (h2 <= t2 && qmax[h2] <= i - x) h2++;
        while (h2 <= t2 && a[i] >= a[qmax[t2]]) t2--;
        qmax[++t2] = i;
        if (a[qmax[h2]] - a[qmin[h1]] > ans) mn = min(mn, a[qmax[h2]] - a[qmin[h1]]), flag = true;
    }
    return flag;
}
signed main() {
    int t;
    cin >> t;
    while (t--) {
        cin >> n >> k;
        for (int i = 1; i <= n; i++) cin >> a[i];
        int l = 1, r = n - k + 1;
        int ans = LONG_LONG_MIN, len;
        while (r - l > 5) {
            int mid = (l + r) >> 1;
            if (check(mid, ans)) {
                ans = mn;
                len = mid;
                r = mid;
            } else l = mid;
        }
        for (int i = r; i >= l; i--) {
            if (check(i, ans)) {
                ans = mn;
                len = i;
            }
        }
        cout << ans << " " << len << endl;
    }
    return 0;
}

大概思路就是用单调队列。

貌似思路是对的就是实现有点问题

2024/1/21 07:22
加载中...