1911: [Apio2010]特别行动队

Time Limit: 4 Sec  Memory Limit: 64 MB
Submit: 5706  Solved: 2876
[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*(sum[i]-sum[j])2+b*(sum[i]-sum[j]+c}

斜率优化,设k<j<i,且j比k更优

\[f[i]-f[k]+a(s[j]^{2}-s[k]^{2})+b(s[k]-s[j])>2a\times s[i]\times (s[j]-s[k])\]

化为:(注意a为负数!!!要变号)

 

\[\frac{f[i]-f[k]+a(s[j]^{2}-s[k]^{2})+b(s[k]-s[j])}{2a(s[j]-s[k])}<s[i]\]

 

 

复制代码
 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 
 5 #define LL long long
 6 #define sqr(x) ((x)*(x))
 7 const int MAXN=1000005;
 8 
 9 int n,a,b,c;
10 int l,r,q[MAXN];
11 LL f[MAXN],s[MAXN];
12 
13 LL cal(LL x)
14 {
15     return a*sqr(x)+b*x+c;
16 }
17 
18 double slope(int k,int j)
19 {
20     return (double)(f[j]-f[k]+a*(sqr(s[j])-sqr(s[k]))+b*(s[k]-s[j]))/(2*a*(s[j]-s[k]));
21 }
22 
23 int main()
24 {
25     scanf("%d",&n);
26     scanf("%d%d%d",&a,&b,&c);
27     for(int i=1;i<=n;i++)
28     {
29         int x;
30         scanf("%d",&x);
31         s[i]=s[i-1]+x;
32     }
33     for(int i=1;i<=n;i++)
34     {
35         while(l<r&&slope(q[l],q[l+1])<s[i]) l++;
36         int t=q[l];
37         f[i]=f[t]+cal(s[i]-s[t]);
38         while(l<r&&slope(q[r],i)<slope(q[r-1],q[r])) r--;
39         q[++r]=i;
40     }
41     printf("%lld",f[n]);
42     return 0;
43 }
复制代码

 

posted @   InWILL  阅读(141)  评论(0编辑  收藏  举报
编辑推荐:
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 程序员常用高效实用工具推荐,办公效率提升利器!
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
点击右上角即可分享
微信分享提示