【BZOJ 1911】【APIO 2010】特别行动队
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】特别行动队的更多相关文章
- BZOJ 1911 (APIO 2010) 特别行动队
题目描述 你有一支由n名预备役士兵组成的部队,士兵从1到n编号,要将他们拆分成若干特别行动队调入战场.出于默契考虑,同一支特别行动队中队员的编号应该连续,即为形如(i,i+1,-,i+k)的序列. 编 ...
- [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 ...
- APIO 2010 特别行动队 斜率优化DP
Description 你有一支由 n 名预备役士兵组成的部队,士兵从 1 到 n 编号,要将他们拆分 成若干特别行动队调入战场.出于默契的考虑,同一支特别行动队中队员的编号 应该连续,即为形如 (i ...
- 【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]+ ...
- [APIO 2010] 特别行动队
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1911 [算法] 设前i个士兵"修正"后的最大战斗力为fi 令su ...
- 【BZOJ 1191】 [Apio2010]特别行动队 (斜率优化)
dsy1911: [Apio2010]特别行动队 [题目描述] 有n个数,分成连续的若干段,每段的分数为a*x^2+b*x+c(a,b,c是给出的常数),其中x为该段的各个数的和.求如何分才能使得各个 ...
- 【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 ...
- BZOJ 1911: [Apio2010]特别行动队 [斜率优化DP]
1911: [Apio2010]特别行动队 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 4142 Solved: 1964[Submit][Statu ...
- 【斜率DP】BZOJ 1911:特别行动队
1911: [Apio2010]特别行动队 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 3006 Solved: 1360[Submit][Statu ...
- bzoj 1911 [Apio2010]特别行动队(斜率优化+DP)
1911: [Apio2010]特别行动队 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 3191 Solved: 1450[Submit][Statu ...
随机推荐
- selenium如何高亮某元素和操作隐藏的内容
高亮元素的思路是: 1.找到要高亮的元素 2.对该元素执行js,更改style达到高亮效果. 操作隐藏的内容思路: 1.可以用Actions的moveToElement,使鼠标悬停在触发隐藏内容的元素 ...
- C++11 之 delete 和 default
1 特殊成员函数 设计一个类,没有成员函数 (member function),只有数据成员 (member data) class DataOnly { private: std::string ...
- 涨知识Style
1.用Access作为后台数据库支撑,书写一个C#写入记录的案例 示例1: using System.Data.OleDb; string sql = "insert into 表 (列1, ...
- 嵌入式Linux驱动学习之路(八)创建最小的根文件系统
busybox 在配置busybox,在是否选择要静态链接库时,在静态下,busybox中的工具不需要动态链接库,能够直接运行.而用户自己编写的程序如果需要动态链接库,还是依然需要有. 如果是动态链接 ...
- eclipse大括号高亮显示---颜色很淡,改为显眼的颜色
window -> preferences -> java(or c++)-> editor -> matching brackets highight, color改为红色
- 图片上传功能<转>http://blog.csdn.net/u011159417/article/details/50126023
以前也实现过上传,只不过每次都是,写完之后没有总结,下次遇到时,还要重新写,重新调式,很是浪费时间,所以,今天实现一个上传图片的功能,包括简单的页面和servlet,下次再要写这个功能时,直接拿过来就 ...
- sqlserver 通用分页存储过程
来源:http://www.jb51.net/article/19936.htm CREATE PROCEDURE commonPagination ), --要显示的列名,用逗号隔开 ), --要查 ...
- QT 常用控件二
QT提供QHBoxLayout类.QVBoxlayout类及QGridLayout类等的基本布局管理,分别是水平排列布局,垂直排列布局和网格排列布局 addWidget()方法用于向布局中加入需要布局 ...
- parsing XML document from class path resource
遇到问题:parsing XML document from class path resource [spring/resources] 解决方法:项目properties— source—remo ...
- suggest插件实现下拉选择筛选
实现的效果展示: 代码如下: 1.需要引入jquery,bootstrap-suggest.js,bootstrap.min.css 2.html页面代码: <!DOCTYPE html> ...