传送门

先写出转移方程$$dp[i]=max\{dp[j]+a*(sum[i]-sum[j])^2+b*(sum[i]-sum[j])+c\}$$

假设$j$比$k$更优,则有$$dp[j]+a*(sum[i]-sum[j])^2+b*(sum[i]-sum[j])+c>dp[k]+a*(sum[i]-sum[k])^2+b*(sum[i]-sum[k])+c$$

展开,并消去同类项之后得$$dp[j]-2*a*sum[i]*sum[j]+a*sum[j]^2-b*sum[j]>dp[k]-2*a*sum[i]*sum[k]+a*sum[k]^2-b*sum[k]$$

移项,得$$(dp[j]+a*sum[j]^2-b*sum[j])-(dp[k]+a*sum[k]^2-b*sum[k])>2*a*sum[i]*sum[j]-2*a*sum[i]*sum[k]$$

设$Y[i]=dp[i]+a*sum[i]^2-b*sum[i],X[i]=sum[i]$

则有$$Y[j]-Y[k]>2*a*sum[i]*X[j]-2*a*sum[i]*X[k]$$

$$\frac{Y[j]-Y[k]}{X[j]-X[k]}>2*a*sum[i]$$

那么就是要我们维护一个上凸包,简单来说就是把原来维护下凸包的那些东西给反过来就好了(ps:我今天刚知道原来凸包还能是上凸的……我太菜了……)

 1 //minamoto
 2 #include<iostream>
 3 #include<cstdio>
 4 #define ll long long
 5 using namespace std;
 6 #define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
 7 char buf[1<<21],*p1=buf,*p2=buf;
 8 inline int read(){
 9     #define num ch-'0'
10     char ch;bool flag=0;int res;
11     while(!isdigit(ch=getc()))
12     (ch=='-')&&(flag=true);
13     for(res=num;isdigit(ch=getc());res=res*10+num);
14     (flag)&&(res=-res);
15     #undef num
16     return res;
17 }
18 const int N=1000005;
19 int sum[N],q[N],h,t,n;ll dp[N],a,b,c;
20 inline ll Y(int i){return dp[i]+a*sum[i]*sum[i]-b*sum[i];}
21 inline double slope(int j,int k){return 1.0*(Y(j)-Y(k))/(sum[j]-sum[k]);}
22 inline ll check(int x){return a*x*x+b*x+c;}
23 int main(){
24     //freopen("testdata.in","r",stdin);
25     n=read(),a=read(),b=read(),c=read();
26     for(int i=1;i<=n;++i) sum[i]=read()+sum[i-1];
27     for(int i=1;i<=n;++i){
28         int k=2*a*sum[i];
29         while(h<t&&slope(q[h],q[h+1])>k) ++h;
30         dp[i]=dp[q[h]]+check(sum[i]-sum[q[h]]);
31         while(h<t&&slope(q[t],q[t-1])<slope(q[t-1],i)) --t;q[++t]=i;
32     }
33     printf("%lld\n",dp[n]);
34     return 0;
35 }

转载于:https://www.cnblogs.com/bztMinamoto/p/9545985.html

洛谷P3628 [APIO2010]特别行动队(斜率优化)相关推荐

  1. 洛谷 P3628 [APIO2010]特别行动队

    题目描述 你有一支由 n 名预备役士兵组成的部队,士兵从 1 到 n 编号,要将他们拆分 成若干特别行动队调入战场.出于默契的考虑,同一支特别行动队中队员的编号 应该连续,即为形如的序列. 编号为 i ...

  2. bzoj 1911: [Apio2010]特别行动队 -- 斜率优化

    1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MB Description Input Output Sample Input 4 ...

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

    1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MB Submit: 4142  Solved: 1964 [Submit][Sta ...

  4. [APIO2010]特别行动队——[斜率优化DP]

    [题目描述] 你有一支由 n 名预备役士兵组成的部队,士兵从 1 到 n 编号,要将他们拆分 成若干特别行动队调入战场.出于默契的考虑,同一支特别行动队中队员的编号 应该连续,即为形如(i,i+1,. ...

  5. APIO2010 特别行动队 斜率优化DP算法笔记

    做完此题之后 自己应该算是真正理解了斜率优化DP 根据状态转移方程$f[i]=max(f[j]+ax^2+bx+c),x=sum[i]-sum[j]$ 可以变形为 $f[i]=max((a*sum[j ...

  6. 【bzoj1911】[Apio2010]特别行动队 斜率优化dp

    题目描述 输入 输出 样例输入 4 -1 10 -20 2 2 3 4 样例输出 9 题解 斜率优化dp 设f[i]表示前i个士兵的战斗力之和的最大值. 那么有f[i]=f[j]+a*(sum[i]- ...

  7. 洛谷3628 APIO2010特别行动队(斜率优化)

    考虑最普通的 d p dp dp d p [ i ] = m a x ( d p [ j ] + a ∗ ( s u m [ i ] − s u m [ j ] ) 2 + b ∗ ( s u m [ ...

  8. 洛谷P3628DTOJ1220 [APOI2010]特别行动队

    洛谷P3628&&DTOJ1220 [APOI2010]特别行动队 题目 题目描述 输入格式 输出格式 样例 样例输入 样例输出 数据范围与提示 题解 题目 题目描述 原题 你有一支由 ...

  9. 特别行动队-斜率优化

    APIO2010特别行动队 令S为前缀和,那么n方DP: f[i]=max{f[i],f[j]+a*(S[i]-S[j])*(S[i]-S[j])+b*(S[i]-S[j])+c}; 展开,移项得到: ...

最新文章

  1. Linux(CentOS 7_x64位)系统下安装RDkit
  2. wireshark从入门到精通(协议排错安全篇)7
  3. powerbuider11 C/S 转换为B/S
  4. 厉害了!这里藏着通关学霸的秘籍
  5. 磁盘Raid方案简单对比
  6. 基于JAVA+SpringMVC+Mybatis+MYSQL的考勤管理系统
  7. canvas画线变粗变模糊的解决办法
  8. RFID入门:Mifare1智能洗澡卡破解分析
  9. pandas之数据合并
  10. vue利用 vue-animate-number插件动态展示数字(从0动态滚动到指定数字)
  11. jquery延时执行
  12. 分页计算起始页和总页数
  13. Oracle中joint,什么是关节中心化(Joint centration)?
  14. 【自学前端】我只学这些够吗?好难
  15. MySQL中的随机抽取
  16. [机缘参悟-83]:如何自我前提应对可能的经-济-危-机?
  17. 2020年高级工程师职称评审必备条件!
  18. java后台获取和js拼接展示信息
  19. BootStrap3 图标glyphicon
  20. BI 与 KPI/BSC

热门文章

  1. 前端利用CryptoJS进行AES对称加解密(16进制编码)
  2. 20191215周学习总结
  3. glibc的头文件 linux_求助,编译glibc头文件时出错
  4. 主类网络号怎么算_一文了解网络文化经营许可证的审批范围
  5. Java容器Stack
  6. dexpler的使用方法
  7. 再看数据库——(2)视图
  8. SQL Server 自定义函数 返回树结构函数
  9. linux双网口绑定,双网口绑定bond
  10. 使用router-view时组件之间的通信