AcWing 289. Transport loop optimization queue sliding window monotone

//对于每个元素,往前看N/2个
//当前是i,前面是j
//i-j+a[i]+a[j]=i+a[i]+a[j]-j
//i是固定的,所以可以用滑动窗口优化,单调队列 
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=2e6+10;
int n;
int w[N];
int q[N];
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>w[i];
        w[i+n]=w[i];
    }
    //滑动窗口优化 
    int res=0;
    int hh=0,tt=-1;
    int len=n/2;
    for(int i=1;i<=2*n;i++)
    {
        //对头不在区间内
        if(hh<=tt&&q[hh]<i-len)
            hh++;
        res=max(res,i-q[hh]+w[q[hh]]+w[i]);
        while(hh<=tt&&w[q[tt]]-q[tt]<=w[i]-i)
            tt--;
        q[++tt]=i;
    }
    cout<<res<<endl;
    return 0;
} 

Guess you like

Origin www.cnblogs.com/QingyuYYYYY/p/12575455.html