97pts玄关求条!!!
查看原帖
97pts玄关求条!!!
1517090
DrDuck楼主2025/2/4 13:08

WA on #8、#22

和大部分题解做法不大一样,我是先枚举左端点,再向右拓展右端点的

#include<bits/stdc++.h>
using namespace std;
const int maxn = 3e+6 + 6;
int k, n, ans;
int a[maxn];
class que
{
    public:
        int head, tail;
        int q[maxn];
        int front()
        {
            return q[head];
        }
        int back()
        {
            return q[tail - 1];
        }
        void pop()
        {
            head++;
        }
        void push(int p)
        {
            q[tail] = p;
            tail++;
        }
        void debug()
        {
            for (int i = head; i < tail; i++)
            {
                cout << q[i] << " ";
            }
            cout << '\n';
        }
}mx, mn;
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> k >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
    }
    int r = 1;
    mx.push(1);
    mn.push(1);
    for (int l = 1; l <= n; l++)
    {
        while (mx.head < mx.tail && mx.front() < l)
        {
            mx.pop();
        }
        while (mn.head < mn.tail && mn.front() < l)
        {
            mn.pop();
        }
        while (abs(a[r + 1] - a[mx.front()]) <= k && abs(a[r + 1] - a[mn.front()]) <= k)
        {
            r++;
            if (r >= n)
            {
                break;
            }
            while (mx.head < mx.tail && a[mx.back()] <= a[r])
            {
                mx.tail--;
            }
            mx.push(r);
            while (mn.head < mn.tail && a[mn.back()] >= a[r])
            {
                mn.tail--;
            }
            mn.push(r);
        }
        if (r >= n)
        {
            ans = max(ans, n - l + 1);
            break;
        }
        ans = max(ans, r - l + 1);
    }
    cout << ans;
    return 0;
}
2025/2/4 13:08
加载中...