• 【GDOI2014模拟】JZOJ2020年8月14日提高组 服务器


    【GDOI2014模拟】JZOJ2020年8月14日提高组 服务器

    题目

    Time and Memory Limits

    在这里插入图片描述

    Description

    我们需要将一个文件复制到n个服务器上,这些服务器的编号为S1, S2, …, Sn。
    首先,我们可以选择一些服务器,直接把文件复制到它们中;将文件复制到服务器Si上,需要花费ci > 0的置放费用。对于没有直接被复制文件的服务器Si来说,它依次向后检查Si+1, Si+2, …直到找到一台服务器Sj:Sj中的文件是通过直接复制得到的,于是Si从Sj处间接复制得到该文件,这种复制方式的读取费用是j – i(注意j>i)。另外,Sn中的文件必须是通过直接复制得到的,因为它不可能间接的通过别的服务器进行复制。我们设计一种复制方案,即对每一台服务器确定它是通过直接还是间接的方式进行复制(Sn只能通过直接方式),最终使每一台服务器都得到文件,且总花费最小。

    Input

    输入文件的第一行有一个整数n,表示服务器的数目。输入文件的第二行有n个整数,顺数第i个表示ci:在Si上直接复制文件的费用。

    Output

    输出文件中只包含一个整数,即最少需要花费的费用。

    Sample Input

    10
    2 3 1 5 4 5 6 3 1 2

    Sample Output

    18

    Data Constraint

    60%的数据中,1 <= n <= 1 000
    100%的数据中,1 <= n <= 1 000 000
    80%的数据中, 1 <= ci <= 50
    100%的数据中,1 <= ci <= 1 000 000 000
    最终结果可能较大,请注意选择适当的数据类型进行计算。

    Hint

    在这里插入图片描述

    题解

    题意

    给出(n)个点
    每个点可以选择两种操作
    一种是直接复制,费用为(a_i)
    一种是间接复制,费用为(i)后面第一个直接复制的(j)(j-i)
    (n)号点必须直接复制
    问最小代价

    分析

    考虑(DP)
    (f[i])表示(i)点直接复制和间接复制的总和
    那么转移
    (f[i]=min{f[j]+j*(j-i)-dfrac{(j-i)(j+i-1)}{2}})
    转移(n^2),过不了
    思考优化
    发现可以斜率优化
    优化
    (dfrac{f[j]-f[k]+dfrac{j^2-k^2+k-j}{2}}{j-k}<i(j>k))
    单调队列维护

    Code

    #include<bits/stdc++.h>
    using namespace std;
    long long n,l,r,ans,f[1000005],q[1000005],a[1000005];
    long long read()
    {
    	long long res=0;char ch;
    	ch=getchar();
    	while (ch<'0'||ch>'9') ch=getchar();
    	while (ch>='0'&&ch<='9')
    	{
    		res=(res<<1)+(res<<3)+(ch-'0');
    		ch=getchar();
    	}
    	return res;
    }
    long long get(long long l,long long r)
    {
    	return r*(r-l)-(r+l-1)*(r-l)/2;
    }
    double slope(long long x,long long y)
    {
    	return (f[x]-f[y]+(x*x-y*y+y-x)/2)*1.0/(x-y);
    }
    int main()
    {
    	n=read();
    	for (long long i=1;i<=n;i++)
    		a[i]=read();
    	f[n]=a[n];
    	l=1;
    	r=1;
    	q[1]=n;
    	for (long long i=n-1;i;i--)
    	{
    		while (l<r&&slope(q[l],q[l+1])>=i) l++;
    		f[i]=a[i]+f[q[l]]+get(i+1,q[l]);
    		while (l<r&&slope(q[r-1],q[r])<slope(q[r],i)) r--;
    		q[++r]=i;
    	}
    	ans=99999999999999;
    	for (long long i=1;i<=n;i++)
    		ans=min(ans,f[i]+get(1,i));
    	printf("%lld
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    Validator 字段验证
    DRF实现发送短信验证码接口
    云片网发送短信验证码
    DRF自定义用户认证
    php服务器端与android客户端通信问题
    转 java调用php的webService
    Ubuntu12.04安装vim7.3
    ubuntu12.10更新源
    源列表
    Ubuntu 12.10 用wubi安装到硬盘中
  • 原文地址:https://www.cnblogs.com/Livingston/p/13504454.html
Copyright © 2020-2023  润新知