[APIO 2010] 特别行动队

[题目链接]

https://www.lydsy.com/JudgeOnline/problem.php?id=1911

[算法]

设前i个士兵"修正"后的最大战斗力为fi

令sumi表示x的前缀和

显然 , 有状态转移方程 : fi = max{ fj + a * (sumi - sumj) ^ 2 + b * (sumi - sumj) + c }

对该式进行化简 , 得 :

fi = max{ fj + asumi ^ 2 + asumj ^ 2 - 2asumisumj + bsumi - bsumj + c}

令Yj = fj + asumj ^ 2 , Xj = sumj

则 : fi = max{Yj - Xj(2sumi + b) + aumi ^ 2 + bsumi + c}

那么Yj = Xj + (2asumi + b) + fi - asumi ^ 2 - bsumi - c

显然我们要做的是最大化截距

2asumi + b单调递减 , Xi单调递增 , 维护一个上凸壳即可

时间复杂度 : O(N)

[代码]

#include<bits/stdc++.h>
using namespace std;
const int N = 1000010;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;

int n , l , r;
ll a , b , c;
int q[N];
ll f[N] , sum[N] , X[N] , Y[N];

template <typename T> inline void chkmax(T &x , T y) { x = max(x , y); }
template <typename T> inline void chkmin(T &x , T y) { x = min(x , y); }
template <typename T> inline void read(T &x)
{
    T f = 1; x = 0;
    char c = getchar();
    for (; !isdigit(c); c = getchar()) if (c == ‘-‘) f = -f;
    for (; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + c - ‘0‘;
    x *= f;
}

int main()
{

        read(n);
        read(a); read(b); read(c);
        for (int i = 1; i <= n; i++)
        {
                int x;
                read(x);
                sum[i] = sum[i - 1] + x;
                X[i] = sum[i];
        }
        f[q[l = r = 1] = 0] = 0;
        for (int i = 1; i <= n; i++)
        {
                while (l < r && Y[q[l + 1]] - Y[q[l]] >= (2 * a * sum[i] + b) * (X[q[l + 1]] - X[q[l]])) ++l;
                f[i] = Y[q[l]] - X[q[l]] * (2 * a * sum[i] + b) + a * sum[i] * sum[i] + b * sum[i] + c;
                Y[i] = f[i] + a * sum[i] * sum[i];
                while (l < r && (Y[i] - Y[q[r]]) * (X[q[r]] - X[q[r - 1]]) >= (Y[q[r]] - Y[q[r - 1]]) * (X[i] - X[q[r]])) --r;
                q[++r] = i;
        }
        printf("%lld\n" , f[n]);

        return 0;

}

原文地址:https://www.cnblogs.com/evenbao/p/10354200.html

时间: 2024-11-09 05:47:59

[APIO 2010] 特别行动队的相关文章

[bzoj 1911][Apio 2010]特别行动队(斜率优化DP)

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1911 分析: 首先可以的到裸的方程f[i]=max{f[j]+a*(Si-Sj)^2+b*(Si-Sj)+c} 0<j<i 简化一下方程,我们知道对于一次项,最后结果肯定是b*Sn 所以可以写成f[i]=max{f[j]+a*(Si-Sj)^2+c} 0<j<i 我们不妨设0<x<y<i,且x比y优 即f[x]+a*(Si-Sx)^2+c>f[y]+a*

APIO 2010 特别行动队 | 斜率优化DP

luogu 3628 si表示序列的前缀和f(i)表示将序列的前i个划分若干段的最大价值f(i)= max{f(j)+a∗(si−sj)2+b∗(si−sj)+c},1≤j<i    = max{−2a*sj*si+f(j)+a*sj*sj−b*sj}+a*si*si+b*si+c,1≤j<i 1 #include <cstdio> 2 #include <string> 3 4 typedef long long ll; 5 6 ll a, b, c; 7 8 ll

Bzoj1911 [Apio2010]特别行动队

1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 3969  Solved: 1873 Description Input Output Sample Input 4 -1 10 -20 2 2 3 4 Sample Output 9 HINT Source 斜率优化DP f[分组末尾]=最优解 f[i] = max{f[j]+A(s[i]-s[j])^2+B(s[i]-s[j])+C}  (0<=j<i)

APIO2010特别行动队(单调队列、斜率优化)

其实这题一看知道应该是DP,再一看数据范围肯定就是单调队列了. 不过我还不太懂神马单调队列.斜率优化-- 附上天牛的题解:http://www.cnblogs.com/neverforget/archive/2012/04/19/2456483.html 1 var f,g:array[0..1000050] of int64; 2 s,q:array[0..1000050] of longint; 3 a,b,c,n,i,h,t,x:longint; 4 bestk:double; 5 pro

BZOJ 1911: [Apio2010]特别行动队 [斜率优化DP]

1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 4142  Solved: 1964[Submit][Status][Discuss] Description Input Output Sample Input 4 -1 10 -20 2 2 3 4 Sample Output 9 HINT f[i]=max{f[j]+...} 随便一化就好了 (a*(s[k]*s[k]-s[j]*s[j])+f[k]-f[

【BZOJ-1911】特别行动队 DP + 斜率优化

1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 3478  Solved: 1586[Submit][Status][Discuss] Description Input Output Sample Input 4 -1 10 -20 2 2 3 4 Sample Output 9 HINT Source Solution 题意非常明显,将n个数划分成多段区间,使得总价值最大,每段区间的价值为$powersu

USACO08MAR土地购买 与 APIO2010特别行动队

两道斜率优化DP: 土地购买 约翰准备扩大他的农场,眼前他正在考虑购买N块长方形的土地.如果约翰单买一块土 地,价格就是土地的面积.但他可以选择并购一组土地,并购的价格为这些土地中最大的长 乘以最大的宽.比如约翰并购一块3 × 5和一块5 × 3的土地,他只需要支付5 × 5 = 25元, 比单买合算. 约翰希望买下所有的土地.他发现,将这些土地分成不同的小组来并购可以节省经费. 给定每份土地的尺寸,请你帮助他计算购买所有土地所需的最小费用. --by luogu 排除不贡献答案的土地: 即把x

[Apio2010]特别行动队

1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MB[Submit][Status][Discuss] Description Input Output Sample Input 4 -1 10 -20 2 2 3 4 Sample Output 9 HINT 斜率优化的式子搞出来之后,a是负的,所以要么不除过去,要么除过去变号 #include<cstdio> #include<iostream> #includ

斜率优化专题4——bzoj 1911: [Apio2010] 特别行动队 题解

[原题] 1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MB Submit: 2134  Solved: 911 [Submit][Status] Description Input Output Sample Input 4 -1 10 -20 2 2 3 4 Sample Output 9 HINT [分析]只要跟着我前面的题目走,这道题真的是太水了.神马题解都不用参考,公式随便推. 易知方程是f[i]=max(f[j]+