正题
题目链接:http://contest-hunter.org:83/contest/0x50%E3%80%8C%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E3%80%8D%E4%BE%8B%E9%A2%98/5501%20%E7%8E%AF%E8%B7%AF%E8%BF%90%E8%BE%93
题目大意
有n座仓库,然后是一个环,两个仓库之间的运输距离为
Ai+Aj+dis(i,j)Ai+Aj+dis(i,j)
dis(i,j)=min(|i−j|,N−|i−j|)dis(i,j)=min(|i−j|,N−|i−j|)
解题思路
我们将A复制一份放在原数组后面,然后就变成了2*n的线性。然后我们枚举i,之后i和j的距离为Ai+Aj+i−jAi+Aj+i−j,于是我们可以找到在n/2范围之内的最小的Aj−jAj−j,于是我们可以用单调队列维护一下就好了。
code
#include<cstdio>
#include<algorithm>
#include<queue>
#define N 2000010
using namespace std;
int n,a[N],maxs;
deque<int> q;
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);a[i+n]=a[i];}for(int i=1;i<=2*n;i++){while(!q.empty()&&i-q.front()>n/2) q.pop_front();//维护区间if(i>=n)maxs=max(maxs,a[i]+i+a[q.front()]-q.front());//统计答案while(!q.empty()&&a[q.back()]-q.back()<a[i]-i) q.pop_back();//维护单调性q.push_back(i);//压入}printf("%d",maxs);
}