zoukankan      html  css  js  c++  java
  • 【Luogu P3628】【BZOJ1911】[APIO2010]特别行动队

    题目:

    链接:

    洛谷链接

    BZOJ链接

    大意:

    (n) 个士兵分段成为若干个特别行动队,对于第 (i) 个士兵,他的战斗力是 (x_i),每个特别行动队的战斗力为 (aX^2+bX+c),其中 (X) 表示行动队了所有士兵的战斗力的和,求一个最好的分段方式使所有行动队的战斗力最大。

    正文:

    考虑用动态规划解决。设状态 (f_{i}) 表示前 (i) 个已经分好段的所有行动队的战斗力。那么动态转移方程是:

    [f_i=max_{j=0}^{i-1}{f_j+a(sum_{k=j+1}^{i}x_k)^2+b(sum_{k=j+1}^{i}x_k)+c} ]

    可以通过前缀和 (sum) 简化式子((sum_i=sum_{j=1}^{i}x_j)):

    [egin{aligned}f_i & =max_{j=0}^{i-1}{f_j+a(sum_i-sum_{j})^2+b(sum_i-sum_{j})+c}\ & = max_{j=0}^{i-1}{f_j+acdot {sum_i}^2-2acdot sum_icdot sum_j+acdot {sum_j}^2+bcdot sum_i-bcdot sum_j+c} end{aligned} ]

    直接枚举 (i,j)( exttt{50}) 分。

    考虑用斜率优化。

    那么选取 (j,k) 决策并且 (0leq j<k<i),若 (j) 决策比 (k) 优, 即:

    [f_j+acdot {sum_i}^2-2acdot sum_icdot sum_j+acdot {sum_j}^2+bcdot sum_i-bcdot sum_j+cgeq f_k+acdot {sum_i}^2-2acdot sum_icdot sum_k+acdot {sum_k}^2+bcdot sum_i-bcdot sum_k+c ]

    通过移项可得斜率方程:

    [frac{(f_j+acdot {sum_j}^2-bcdot sum_j)-(f_k+acdot {sum_k}^2-bcdot sum_k)}{sum_j-sum_k}geq 2acdot sum_i ]

    代码:

    
    const int N = 1000010;
    
    int n, a, b, c;
    ll f[N], sum[N], que[N], aa[N];
    int head = 1, tail = 1;
    
    double slope(int x, int y)
    {
    	return (double) (f[x] - f[y] + a * sum[x] * sum[x] - a * sum[y] * sum[y] - b * sum[x] + b * sum[y] + 0.0)/(sum[x] - sum[y] + 0.0);
    }
    
    int main()
    {
    	scanf ("%d%d%d%d", &n, &a, &b, &c);
    	for (int i = 1; i <= n; ++i)
    	{
    		scanf ("%lld", &aa[i]);
    		sum[i] += sum[i - 1] + aa[i];
    	}
    	for (int i = 1; i <= n; ++i)
    	{
    		while(head < tail && slope(que[head], que[head + 1]) >= 2.0 * a * sum[i]) head++;
    		f[i] = f[que[head]] + a * sum[i] * sum[i] - 2 * a * sum[i] * sum[que[head]] +
    			a * sum[que[head]] * sum[que[head]] + b * sum[i] - b * sum[que[head]] + c;
    		while(head < tail && slope(que[tail - 1], que[tail]) <= slope(que[tail], i)) tail--;
    		que[++tail] = i;
    	}
    	printf("%lld", f[n]);
        return 0;
    }
    
    
    
  • 相关阅读:
    Linux-Bond-Configure
    Kvm学习文档记录
    Can't locate Log/Dispatch.pm in @INC
    sas2ircu工具信息收集及磁盘定位
    python 之tornado 入门
    zabbix 监控 tomcat jmx
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
  • 原文地址:https://www.cnblogs.com/GJY-JURUO/p/12495753.html
Copyright © 2011-2022 走看看