$ 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. oracle 如何更改密码的hash

    如何迁移oracle user的密码到新的环境,一下列出了方法: select name,spare4||';'||password pwd from sys.user$ where name = ' ...

  2. React-Native 之 GD (一)目录结构与第三方框架使用与主题框架搭建

    1.APP效果图 2.工程环境配置 IOS: 将压缩包内的 Images.xcassets 文件夹直接替换掉我们iOS工程中的 Images.xcassets 文件夹. 这时候我们可以看到所有图片资源 ...

  3. React-Native 之 GD (十七)小时风云榜按钮处理

    小时风云榜按钮处理 在服务器返回给我们的 json 数据中,提供了 hasnexthour 字段,当这个字段返回为 1 的时候,表示后面还有内容,按钮可以点击,否则不能点击,按照这个思路,我们就来完成 ...

  4. AtomicIntegerArray 源码分析

    AtomicIntegerArray AtomicIntegerArray 能解决什么问题?什么时候使用 AtomicIntegerArray? 可以用原子方式更新其元素的 int 数组 如何使用 A ...

  5. HTML - form 表单提交

    form 表单提交 数据发送 disabled:不发送 display_none:发送 type_hidden:发送 readonly:发送 测试 html: <!DOCTYPE html> ...

  6. 转:高效实用的.NET开源项目

    本文转自:http://www.cnblogs.com/pengze0902/p/7669631.html 似乎...很久很久没有写博客了,一直都想写两篇,但是却没有时间写.感觉最近有很多事情需要处理 ...

  7. struts2 基础2 类型转换器

    struts2常用常量的定义与意义 每一次请求都会创建一个新的action,所以struts2的action是线程安全的 拆分struts 为应用指定多个struts配置文件 src 下为各应用配置的 ...

  8. LeetCode——141 设计链表

    题目: 简单说下思路: 用两个指针,一个跑得快,一个跑得慢(例如一个每次前进两步,一个前进一步),这样只要快指针不会撞上NULL(如果遇到了NULL的情况那么必然不存在环),快指针肯定会和慢指针碰面( ...

  9. kNN算法实例(约会对象喜好预测和手写识别)

    import numpy as np import operator import random import os def file2matrix(filePath):#从文本中提取特征矩阵和标签 ...

  10. Java学习day6数组

    ---恢复内容开始--- Java数组 Java 语言中提供的数组是用来存储固定大小的同类型元素.你可以声明一个数组变量,如 numbers[100] 来代替直接声明 100 个独立变量 number ...