原题:https://ac.nowcoder.com/acm/contest/1045/B
题意:给n个元素围成一个环 求
m
a
x
{
A
i
+
A
j
+
d
i
s
(
i
,
j
)
}
max\left\{ A_i+A_j+dis(i,j)\right\}
max{Ai+Aj+dis(i,j)},
d
i
s
(
i
,
j
)
=
m
i
n
(
∣
i
−
j
∣
,
∣
n
−
i
−
j
∣
)
dis(i,j)=min(|i-j|,|n-i-j|)
dis(i,j)=min(∣i−j∣,∣n−i−j∣)
题解:将环拆成链,求
m
a
x
{
A
i
−
i
+
A
j
+
j
}
max\left\{A_i-i+A_j+j \right\}
max{Ai−i+Aj+j} 并且
i
<
j
i<j
i<j 用单调队列维护
A
j
+
j
A_j+j
Aj+j
/*
环路运输
https://ac.nowcoder.com/acm/problem/51187
*/
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
typedef long long ll;
ll a[N<<1];
int n;
struct node{
ll p,x;
node(){}
node(ll a,ll b){
p=a;x=b;
}
};
deque<node> q;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) {
scanf("%lld",&a[i]);
a[n+i]=a[i];
}
int m=n/2;ll ans=0;
for(int i=1,j=2;i<=2*n-m;i++){
if(q.front().p==i) q.pop_front();
for(;j<=i+m;j++){
while(!q.empty() && (a[j]+j > q.back().x)){
q.pop_back();
}
q.push_back(node(j,a[j]+j));
}
node tmp=q.front();
ans=max(ans,1ll*a[i]-i+tmp.x);
}
printf("%lld\n",ans);
return 0;
}