APIO2010特别行动队(单调队列、斜率优化)

其实这题一看知道应该是DP,再一看数据范围肯定就是单调队列了。

不过我还不太懂神马单调队列、斜率优化……

附上天牛的题解:http://www.cnblogs.com/neverforget/archive/2012/04/19/2456483.html

 1 var f,g:array[0..1000050] of int64;
2 s,q:array[0..1000050] of longint;
3 a,b,c,n,i,h,t,x:longint;
4 bestk:double;
5 procedure init;
6 begin
7 readln(n);
8 readln(a,b,c);
9 s[0]:=0;
10 for i:=1 to n do
11 begin
12 read(x);
13 s[i]:=s[i-1]+x;
14 end;
15 end;
16 function k(x,y:longint):double;
17 begin
18 exit(double(g[y]-g[x])/(s[y]-s[x]));
19 end;
20 procedure main;
21 begin
22 f[0]:=0;h:=1;t:=1;q[1]:=0;
23 for i:=1 to n do
24 begin
25 bestk:=double(2*a*s[i]);
26 while (h<t) and (k(q[h],q[h+1])>=bestk) do inc(h);
27 f[i]:=int64(f[q[h]])+int64(a)*int64(s[i]-s[q[h]])*int64(s[i]-s[q[h]])
28 +int64(b)*int64(s[i]-s[q[h]])+int64(c);
29 g[i]:=int64(f[i])+int64(a)*int64(s[i])*int64(s[i])-int64(b)*int64(s[i]);
30 while (h+1<=t) and (k(q[t],i)>k(q[t-1],q[t])) do dec(t);
31 inc(t);
32 q[t]:=i;
33 end;
34 end;
35 procedure print;
36 begin
37 writeln(f[n]);
38 end;
39 begin
40 init;
41 main;
42 print;
43 end.

APIO2010特别行动队(单调队列、斜率优化),布布扣,bubuko.com

时间: 2024-10-11 13:01:38

APIO2010特别行动队(单调队列、斜率优化)的相关文章

HDU 3507 单调队列 斜率优化

斜率优化的模板题 给出n个数以及M,你可以将这些数划分成几个区间,每个区间的值是里面数的和的平方+M,问所有区间值总和最小是多少. 如果不考虑平方,那么我们显然可以使用队列维护单调性,优化DP的线性方法来做,但是该题要求的是区间和的平方,于是要转换单调的计算方法为斜率,也就是凸线. 其他就是最基本的单调DP /** @Date : 2017-09-04 15:39:05 * @FileName: HDU 3507 单调队列 斜率优化 DP.cpp * @Platform: Windows * @

DP单调队列--斜率优化P3195

题意:https://www.luogu.com.cn/problem/P3195 思路:https://www.luogu.com.cn/problemnew/solution/P3195 1 #define IOS ios_base::sync_with_stdio(0); cin.tie(0); 2 #include <cstdio>//sprintf islower isupper 3 #include <cstdlib>//malloc exit strcat itoa

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

1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 3191  Solved: 1450[Submit][Status][Discuss] Description Input Output Sample Input 4 -1 10 -20 2 2 3 4 Sample Output 9 HINT Source [思路] 斜率优化. 设f[i]表示将前i个分组的最优值,则有转移方程式: f[i]=max{ f[j]

【BZOJ1911】[Apio2010]特别行动队 斜率优化DP

想了好久啊.... 用了我感觉比较好写的一种(因为没写过维护凸包),另一种是维护凸包的做法,本质一样?推荐http://www.mamicode.com/info-detail-345781.html. 网上的大多数解法: DP:f[i]=max(f[j]+a*(sum[i]-sum[j])^2+b(sum[i]-sum[j])+c) 显然复杂度不对. 那么假设j>k且f[j]优于f[k] f[j]-f[k]+a*(sum[j]^2-sum[k]^2)-b*(sum[j]-sum[k])>2*

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

[APIO2010]特别行动队 题面很直白,就不放了. 太套路了,做起来没点感觉了. \(dp(i)=dp(j)+a*(s(i)-s(j))^{2}+b*(s(i)-s(j))+c\) 直接推出一个斜率优化的式子上单调队列就好了 时间/空间复杂度:\(O(n)\) #include<cstdio> #define sid 1000500 #define ri register int #define ll long long #define dd double using namespace

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

1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 4142  Solved: 1964[Submit][Status][Discuss] Description Input Output Sample Input 4 -1 10 -20 2 2 3 4 Sample Output 9 HINT f[i]=max{f[j]+...} 随便一化就好了 (a*(s[k]*s[k]-s[j]*s[j])+f[k]-f[

斜率优化专题4——bzoj 1911: [Apio2010] 特别行动队 题解

[原题] 1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MB Submit: 2134  Solved: 911 [Submit][Status] Description Input Output Sample Input 4 -1 10 -20 2 2 3 4 Sample Output 9 HINT [分析]只要跟着我前面的题目走,这道题真的是太水了.神马题解都不用参考,公式随便推. 易知方程是f[i]=max(f[j]+

BZOJ 1911: [Apio2010]特别行动队( dp + 斜率优化 )

sum为战斗力的前缀和 dp(x) = max( dp(p)+A*(sumx-sump)2+B*(sumx-sump)+C )(0≤p<x) 然后斜率优化...懒得写下去了... -------------------------------------------------------------------------------- #include<bits/stdc++.h> using namespace std; typedef long long ll; const in

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

1911: [Apio2010]特别行动队 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 5057  Solved: 2492[Submit][Status][Discuss] Description Input Output Sample Input 4 -1 10 -20 2 2 3 4 Sample Output 9 HINT dp[i]=dp[j]+a*x*x+b*x+cx=sum[i]-sum[j] 证明单调性假设对于i点 k<j且j的决策