bzoj1911

【bzoj1911】[Apio2010]特别行动队commando

2014年5月18日3,1920

Description

Input

Output

Sample Input

4
-1 10 -20
2 2 3 4

Sample Output

9

HINT

题解

我发现似乎掌握了特殊的斜率优化技巧,我会假装四处看风景

dp方程:f[i]=max(f[j]+a*(sum[i]-sum[j])^2+b*(sum[i]-sum[j])+c)

如果j>k且j比k更优

f[j]-f[k]+a*sum[j]^2-a*sum[k]^2+b*(sum[k]-sum[j])>2*a*(sum[j]-sum[k])*sum[i]

转引自hzw的blog,太懒了,什么都没剩下,这道题还是普普通通的斜率优化裸题

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #define ll long long
 7
 8 using namespace std;
 9
10 const int NN=1e6+7;
11
12 int n,l,r;
13 int a,b,c;
14 int x[NN],q[NN];
15 ll sum[NN],f[NN];
16
17 ll sqr(ll x)
18 {
19     return x*x;
20 }
21 double slop(int k,int j)
22 {
23     return (double)(f[j]-f[k]+a*(sqr(sum[j])-sqr(sum[k]))+b*(sum[k]-sum[j]))/(double)(2*a*(sum[j]-sum[k]));
24 }
25 int main()
26 {
27     scanf("%d%d%d%d",&n,&a,&b,&c);
28     for(int i=1;i<=n;i++)
29     {
30         scanf("%d",&x[i]);
31         sum[i]=sum[i-1]+x[i];
32     }
33     for(int i=1;i<=n;i++)
34     {
35         while(l<r&&slop(q[l],q[l+1])<sum[i]) l++;//因为a<0我去
36         int t=q[l];
37         f[i]=f[t]+a*sqr(sum[i]-sum[t])+b*(sum[i]-sum[t])+c;
38         while(l<r&&slop(q[r-1],q[r])>slop(q[r],i)) r--;
39         q[++r]=i;
40     }
41     printf("%lld",f[n]);
42 }
时间: 2024-10-09 02:03:17

bzoj1911的相关文章

【BZOJ1911】[Apio2010]特别行动队 斜率优化DP

想了好久啊.... 用了我感觉比较好写的一种(因为没写过维护凸包),另一种是维护凸包的做法,本质一样?推荐http://www.mamicode.com/info-detail-345781.html. 网上的大多数解法: DP:f[i]=max(f[j]+a*(sum[i]-sum[j])^2+b(sum[i]-sum[j])+c) 显然复杂度不对. 那么假设j>k且f[j]优于f[k] f[j]-f[k]+a*(sum[j]^2-sum[k]^2)-b*(sum[j]-sum[k])>2*

[bzoj1911][Apio2010特别行动队]

Description Input Output Sample Input 4 -1 10 -20 2 2 3 4 Sample Output 9 HINT Solution 斜率优化动态规划 首先易得出这样的一个朴素状态转移方程 f[i]=max{f[j]+cal(sum[i]-sum[j])} 其中j<i,且cal(x)=a*x*x+b*x+c 那么设转移方程中的式子为V 若i<j,且V(j)>V(i) 那么,f[j]-f[i]+a*sum[j]^2-a*sum[i]^2+b*(su

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)

【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

【bzoj1911】[Apio2010]特别行动队

题目描述 输入 输出 样例输入 4 -1 10 -20 2 2 3 4 样例输出 9 题解 dp+斜率优化 设f[i]表示前i个士兵的战斗力之和的最大值. 那么有f[i]=f[j]+a*(sum[i]-sum[j])^2+b*(sum[i]-sum[j])+c, 其中sum为前缀和. 展开平方,整理得f[j]+a*sum[j]^2-b*sum[j]=2*a*sum[i]*sum[j]+f[i]-a*sum[i]^2-b*sum[i]-c. 这样就得到了y=kx+b的形式,而且要求的是其中b的最大

bzoj1911【APIO2010】特别行动队

1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MB Submit: 3600  Solved: 1651 [Submit][Status][Discuss] Description Input Output Sample Input 4 -1 10 -20 2 2 3 4 Sample Output 9 HINT Source 斜率优化DP #include<iostream> #include<cstdio>

BZOJ1911 [Apio2010]特别行动队 - 动态规划 - 斜率优化

欢迎访问~原文出处--博客园-zhouzhendong&AK 去博客园看该题解 题目传送门 题意概括 把一个整数序列划分成任意连续的段,使得划分出来的每一段的价值和最大. 对于某一段,价值的计算公式为 V=ax^2+bx+c,其中 x 为当前段的数值和. 题解 这题是博主大蒟蒻的第一道斜率优化DP题-- C++:while (1) 懵逼++; Pascal:while (true) do inc(懵逼); 本题首先一看就是 DP 题. 但是一看 1<=n<=1000000,-5<

bzoj1911 [Apio2010]特别行动队commando

题目链接 斜率优化 1 #include<cstdio> 2 #include<cstdlib> 3 #include<string> 4 #include<cstring> 5 #include<cmath> 6 #define re(i,l,r) for(int i=(l);i<=(r);i++) 7 using namespace std; 8 typedef long long LL; 9 template<typename

[BZOJ1911][BZOJ1912][BZOJ1913]APIO2010解题报告

特别行动队 Description 这个好像斜率优化不是一般地明显了啊...只不过要分a的正负两种情况考虑是维护上凸还是下凸 1 /************************************************************** 2 Problem: 1911 3 User: mjy0724 4 Language: C++ 5 Result: Accepted 6 Time:1688 ms 7 Memory:24248 kb 8 *******************