• 环路运输


    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
    ",ans);
        return 0;
    }
    
    
  • 相关阅读:
    区间DP+next求循环节 uva 6876
    连分数(分数类模板) uva6875
    二分+最短路 uvalive 3270 Simplified GSM Network(推荐)
    叉积判断 POJ1696
    树形DP+树状数组 HDU 5877 Weak Pair
    团 大连网赛 1007 Friends and Enemies
    微信支付少一分钱
    数据类型的转换
    什么是机器学习
    config.m4
  • 原文地址:https://www.cnblogs.com/PPXppx/p/10940274.html
Copyright © 2020-2023  润新知