$ BZOJ1911*~ $ 特别行动队: (斜率优化)



$ solution: $

感觉这道题目还是比较常规的,首先我们很容易想到DP,因为题目里面说了选出的人都是连续的,这意味着我们可以从前往后DP。我们直接设 \(f[i]\) 表示前 \(i\) 在分组之后的战斗力之和(因为题目没有明确要求分几组,所以我们省去这一维度)。然后转移也比较常规,我们枚举前面的某一个人 \(k\) 作为这一组人的左端点(右端点就是第 \(i\) 个人)。这题数据范围很大,我们也不用着急,现将式子列出来,如果转移不能优化再另寻他法。(事实上这种没有性质的DP,优化只能靠转移方程)

转移方程:

$ F[i]=F[k]+a\times (S[i]-S[k])^2+b\times(S[i]-S[k])+c $

把这个式子拆开你就会看到一个与 \(i,k\) 都有关的乘积项,这是斜率优化的标志:

$ F[i] = F[k] + a\times S[i]^2 - 2a\times S[i]\times S[k] + a\times S[k]^2+b\times S[i] - b\times S[k] + c $

然后我们将同一类的项移动到一起,化为斜率优化的标准式:

$ F[k] + a\times S[k]^2 - b\times S[k] = + 2a\times S[i]\times S[k] + F[i] -a\times S[i]^2 - b\times S[i] - c $

然后我们将 乘积项\(2a\times S[i]\times S[k]\) 里面有关于 \(k\) 的 \(S[k]\) 作为横坐标(自变量) ,然后等式右边有关 \(k\) 的项 \(F[k] + a\times S[k]^2 - b\times S[k]\) 作为纵坐标(应变量)。然后我们要 \(F[i]\) 最大,其实就是让截距 \(F[i] -a\times S[i]^2 - b\times S[i] - c\) 最大。于是直接斜率优化即可。



$ code: $

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set> #define ll long long
#define db double
#define rg register int using namespace std; int n;
ll a,b,c;
int s[1000005];
int q[1000005];
ll g[1000005];
ll f[1000005]; inline int qr(){
register char ch; register bool sign=0; rg res=0;
while(!isdigit(ch=getchar()))if(ch=='-')sign=1;
while(isdigit(ch))res=res*10+(ch^48),ch=getchar();
if(sign)return -res; else return res;
} int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
n=qr(); a=qr(); b=qr(); c=qr(); rg l=1,r=0;
for(rg i=1;i<=n;++i) s[i]=s[i-1]+qr();
for(rg i=1;i<=n;++i){ q[++r]=i-1;
while(l<r&&g[q[l+1]]-g[q[l]]>=2*a*s[i]*(s[q[l+1]]-s[q[l]]))++l;
rg x=s[i]-s[q[l]];
f[i]=f[q[l]]+a*x*x+b*x+c;
g[i]=f[i]+a*s[i]*s[i]-b*s[i];
while(l<r&&(g[q[r]]-g[q[r-1]])*(s[i]-s[q[r]])<=(g[i]-g[q[r]])*(s[q[r]]-s[q[r-1]]))--r;
}printf("%lld\n",f[n]);
return 0;
}

BZOJ 1911 特别行动队 (斜率优化)的更多相关文章

  1. BZOJ 1911 特别行动队(斜率优化DP)

    应该可以看出这是个很normal的斜率优化式子.推出公式搞一搞即可. # include <cstdio> # include <cstring> # include < ...

  2. bzoj1911 [Apio2010]特别行动队——斜率优化DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1911 相当明显的斜率优化,很好做: 注意slp里面要有(double),以免出现精度问题. ...

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

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

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

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

  5. 【斜率DP】BZOJ 1911:特别行动队

    1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 3006  Solved: 1360[Submit][Statu ...

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

    1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 5057  Solved: 2492[Submit][Statu ...

  7. [APIO2010]特别行动队 --- 斜率优化DP

    [APIO2010]特别行动队 题面很直白,就不放了. 太套路了,做起来没点感觉了. \(dp(i)=dp(j)+a*(s(i)-s(j))^{2}+b*(s(i)-s(j))+c\) 直接推出一个斜 ...

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

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

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

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

随机推荐

  1. 用CSS代码编写简易轮播图

    废话不多说,直接上代码 <!doctype html> <html> <head> <title></title> <meta cha ...

  2. 带有ir的单词

    hire thirty thirteen third sir birthday shirt stir circle dirty skirt affirm affirmation affirmable ...

  3. DRF中的视图集的使用

    1.说明:DRF框架中的视图集: 在drf开发接口中,使用GenericAPIView和视图扩展类结合起来完成接口功能是一件很常见的事情,所以,drf的作者帮我们提前把  GenericAPIView ...

  4. 开机自启动Powershell脚本

    目录 目录 前言 修改注册表 写批处理 以管理员方式打开Posershell程序 修改PS-profile 最后 前言 这绝B是个非常受用的技能. 修改注册表 Open Registry Editor ...

  5. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_02 递归_4_练习_递归打印多级目录

    递归所有的文件夹,并把文件都输出出来. 在最上面打印目录的名称

  6. python基础数据类型补充以及编码的进阶

    一.基本数据类型的补充循环列表改变列表大小的问题#请把列表中索引为基数的元素写出l1=[1,2,3,4,5,6]for i in l1: if i%2!=0: print(i)结果:135二:基本数据 ...

  7. 应用安全 - 代码审计 -Java

    Java %c0%ae 安全模式绕过漏洞 原理 在Java端"%c0%ae"解析为"\uC0AE",最后转义为ASCCII低字符-".".通 ...

  8. ecshop注册用户增加手机验证功能

    1.去掉“用户名”注册 a.去掉提交 user_passport.dwt页面去掉 <input name="username" type="text" s ...

  9. JAVA调用shell脚本利用ansible修改多节点上的redis参数

    创建hosts文件 创建ansible-playbook执行时所用到的hosts文件,例如 /etc/redis/hosts 利用shell命令根据传入的host名和地址写入hosts文件: #set ...

  10. 第一次Java学习总结

    初学Java感觉还是蛮可以的,可是做起题目来还是不能得心应手,自己不懂得太多太多,还是需要不断努力去学啊!下面我就把这些天学到的知识点总结一下: 初学Java,我把目前所学知识点总结如下: 1.jav ...