题解:P10957 环路运输
看到绝对值先把它拆了,原式等价于:
至于
然后看到环先把它拆成链,
那么原式的第二条也没有意义了,变为:
所以我们要从前往后枚举,此时原式看起来像是单调队列优化,所以考虑变形(从前往后枚举):
好了,我们只需要维护
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=2e6+1;
int n,a[N],q[N],h,t,ans;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
a[i+n]=a[i];
}
for(int i=1;i<=n*2;i++){
while(h<=t&&i-q[h]>n/2) h++;
if(h<=t) ans=max(ans,a[i]+a[q[h]]+i-q[h]);
while(h<=t&&a[q[t]]-q[t]<=a[i]-i) t--;
q[++t]=i;
}
cout<<ans;
}