首页 > 其他 > 详细

环路运输

时间:2019-05-28 21:37:47      阅读:181      评论:0      收藏:0      [点我收藏+]

CH

题意:在一条环形公路旁均匀地分布着\(N\)座仓库,编号为\(1~N\),编号为\(i\)的仓库与编号为\(j\)的仓库之间的距离定义为\(dist(i,j)=min(|i-j|,N-|i-j|)\),也就是逆时针或顺时针从\(i\)\(j\)中较近的一种.每座仓库都存有货物,其中编号为\(i\)的仓库库存量为\(A_i\)\(i\)\(j\)两座仓库之间运送货物需要的代价为\(A_i+A_j+dist(i,j)\).求在哪两座仓库之间运送货物需要的代价最大?\(1≤N≤10^6,1<=Ai<=10^7\)

分析:断环为链,在长度为\(2N\)的公路,找到\(i\)\(j\),使得\(a_i+a_j+i-j\)最大.我们假设\(1<=j<i<=2N\),则\(i-j<=N/2\).

枚举\(i\),对于每个\(i\),找到一个\(j(i-N/2<=j<=i-1)\),使得\(a_j-j\)尽量大,对于这个显然可以用单调队列来维护.单调队列优化DP的模板题.

#include<bits/stdc++.h>
using namespace std;
inline int read(){
   int s=0,w=1;char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
   return s*w;
}
const int N=2*1e6+5;
int a[N],q[N];
int main(){
    int n=read();
    for(int i=1;i<=n;i++)a[i+n]=a[i]=read();
    int l=1,r=1,ans=0;
    for(int i=1;i<=n*2;i++){
        while(l<=r&&q[l]<(i-n/2))l++;
        ans=max(ans,a[i]+i+a[q[l]]-q[l]);
        while(l<=r&&a[q[r]]-q[r]<=a[i]-i)r--;
        q[++r]=i;   
    }
    printf("%d\n",ans);
    return 0;
}

环路运输

原文:https://www.cnblogs.com/PPXppx/p/10940274.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!