http://www.lydsy.com/JudgeOnline/problem.php?id=1911

夏令营里斜率优化的例题,我调了一晚上,真是弱啊。

先推公式吧($sum_i$表示$x_1 \dots x_i$的和):

$$①f(i)=f(j)+a(sum_i -sum_j)^2 +b(sum_i -sum_j)+c$$

$$②f(i)=f(k)+a(sum_i -sum_k)^2 +b(sum_i -sum_k)+c$$

①和②分别表示从j和k这两个位置的转移过程,且满足$0≤j<k<i$

然后假设②比①更优,则②的等号右边减去①的等号右边大于0

$$f(k)-f(j)+a(sum_i -sum_k)^2 -a(sum_i -sum_j)^2 +b(sum_i -sum_k)  -b(sum_i -sum_j)>0$$

把平方算出来后相同的项消去得到:

$$f(k)-f(j)+2asum_i(sum_j - sum_k)-a(sum_j^2 - sum_k^2)+b(sum_j -sum_k)>0$$

又因为$sum_j -sum_k < 0$,所以两边同时除以$sum_j -sum_k$:

$$\frac{f(k)-f(j)}{sum_j -sum_k}+2asum_i +b-a(sum_j + sum_k)<0$$

移项后通分:

$$2asum_i +b<\frac{[f(k)+asum_k^2]-[f(j)+asum_j^2]}{sum_k -sum_j}$$

$2asum_i +b$是单调递减的,这样就化成了一个斜率优化的式子,对于一个位置$t$,可以把它看成二维平面上坐标为$(sum_t,f(t)+asum_t^2)$的点,用双端队列维护一个这些点的下凸壳进行转移,时间复杂度$O(n)$

夏令营讲题时自己推式子推错了!!!斯巴达!!!!!!!!!好久才发现。式子改正过来后对拍还是错,后来发现改的太急了忘加了两个括号斯巴达!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

为了A掉这道题耗了一晚上,全是脑残和手残造成的,已无力吐槽_(:з」∠)_

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1000003;
typedef long long ll;
int in() {
int k = 0, fh = 1; char c = getchar();
for(; c < '0' || c > '9'; c = getchar())
if (c == '-') fh = -1;
for(; c >= '0' && c <= '9'; c = getchar())
k = (k << 3) + (k << 1) + c - '0';
return k * fh;
} ll f[N], sum[N], key;
int n, a, b, c, q[N]; bool cmp(int x, int y) {
return f[y] + sum[y] * sum[y] * a - f[x] - sum[x] * sum[x] * a > key * (sum[y] - sum[x]);
}
bool cmpk(int x, int y, int z) {
return (f[z] + sum[z] * sum[z] * a - f[y] - sum[y] * sum[y] * a) * (sum[y] - sum[x])
> (f[y] + sum[y] * sum[y] * a - f[x] - sum[x] * sum[x] * a) * (sum[z] - sum[y]);
} int main() {
n = in(); a = in(); b = in(); c = in();
sum[0] = 0;
for(int i = 1; i <= n; ++i)
sum[i] = in(), sum[i] += sum[i - 1]; ll qu;
int head = 0, tail = 1, t;
f[0] = 0;
f[1] = sum[1] * sum[1] * a + sum[1] * b + c;
q[0] = 0; q[1] = 1;
for(int i = 2; i <= n; ++i) {
key = sum[i] * a * 2 + b;
while (head < tail && cmp(q[head], q[head + 1])) ++head;
t = q[head]; qu = sum[i] - sum[t];
f[i] = f[t] + qu * qu * a + qu * b + c;
while (head < tail && cmpk(q[tail - 1], q[tail], i)) --tail;
q[++tail] = i;
} printf("%lld\n", f[n]);
return 0;
}

( ̄▽ ̄")不过最后还是A掉了233

【BZOJ 1911】【APIO 2010】特别行动队的更多相关文章

  1. BZOJ 1911 (APIO 2010) 特别行动队

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

  2. [bzoj 1911][Apio 2010]特别行动队(斜率优化DP)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1911 分析: 首先可以的到裸的方程f[i]=max{f[j]+a*(Si-Sj)^2+b*(S ...

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

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

  4. 【BZOJ 1911】 [Apio2010]特别行动队

    Description Input Output Sample Input 4 -1 10 -20 2 2 3 4 Sample Output 9 HINT   转移方程 f[i]=max(f[j]+ ...

  5. [APIO 2010] 特别行动队

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1911 [算法] 设前i个士兵"修正"后的最大战斗力为fi 令su ...

  6. 【BZOJ 1191】 [Apio2010]特别行动队 (斜率优化)

    dsy1911: [Apio2010]特别行动队 [题目描述] 有n个数,分成连续的若干段,每段的分数为a*x^2+b*x+c(a,b,c是给出的常数),其中x为该段的各个数的和.求如何分才能使得各个 ...

  7. 【BZOJ】【1911】【APIO2010】特别行动队commando

    DP/斜率优化 嗯……第三道斜率优化的题目了. 定义 $s[i]=\sum_{k=1}^{i} x[k] $ 方程:$f[i]=max\{ f[j]+a*(s[i]-s[j])^2+b*(s[i]-s ...

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

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

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

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

  10. bzoj 1911 [Apio2010]特别行动队(斜率优化+DP)

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

随机推荐

  1. 【2016-10-15】【坚持学习】【Day6】【组合模式】

    哈哈,今天偷懒了,在晚上只看了一个组合模式. 例子: 树结构,有一些是树节点,一些是叶子节点. 比如,文件夹树结构,一个是文件夹节点,一个是文件节点,虽然都是树的节点,但是具体的业务肯定是区别的. 代 ...

  2. VIJOS1476旅游规划[树形DP 树的直径]

    描述 W市的交通规划出现了重大问题,市政府下决心在全市的各大交通路口安排交通疏导员来疏导密集的车流.但由于人员不足,W市市长决定只在最需要安排人员的路口安放人员.具体说来,W市的交通网络十分简单,它包 ...

  3. Interceptor

    拦截器是可以控制权限,当用户需要查看查看某些功能的时候,需要判断是不是登录了,如果没有登录的,就可拦截的过程.. 首先,我们都知道struts.xml 中有action 节点, 这个节点表示你想要访问 ...

  4. ADO.NET防止字符串攻击方法

    在黑窗口里面输入内容时利用拼接语句可以对数据进行攻击 如:输入班级值 --:代表后边内容都被注释掉了 防止SQL注入攻击方法: 再给命令发送SQL语句的时候分两次发送,把SQL语句拆成两块,用户输入的 ...

  5. 包含文件函数include与require的区别

    include或include_once一般用于动态包含,所谓动态包含就是根据不同条件包含不同文件 require或require_once一般用于静态包含,比如包含一个html文件的头部或者尾部 如 ...

  6. ASP.NET CORE 1.0 MVC API 文档用 SWASHBUCKLE SWAGGER实现

    from:https://damienbod.com/2015/12/13/asp-net-5-mvc-6-api-documentation-using-swagger/ 代码生成工具: https ...

  7. GLM in SPM

    主要记一句话: SPM的GLM模型中的β,指的是相应regressor对最后测量得到的信号所产生的效应(effect). 后续的假设检验过程实际上都是对各个regressor的β向量进行的. The ...

  8. Codevs 1860 最大数 string大法好,STL万岁。。

    题目描述 Description 设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数. 输入描述 Input Description 第一行一个正整数n. 第二行n个正整数,空格隔开 ...

  9. 上传Text文档并转换为PDF(解决乱码)

    前些日子,Insus.NET有分享一篇<上传Text文档并转换为PDF>http://www.cnblogs.com/insus/p/4313092.html 它是按最简单与默认方式来处理 ...

  10. Linux 网络编程详解三(p2p点对点聊天)

    //p2p点对点聊天多进程版--服务器(信号的使用) #include <stdio.h> #include <stdlib.h> #include <string.h& ...