[luogu P3628] [APIO2010]特别行动队
2021-05-06 21:27
标签:read 输入输出格式 for psu 最大 char col i++ lin 你有一支由 n 名预备役士兵组成的部队,士兵从 1 到 n 编号,要将他们拆分 成若干特别行动队调入战场。出于默契的考虑,同一支特别行动队中队员的编号 应该连续,即为形如(i, i + 1, ..., i + k)(i,i+1,...,i+k)的序列。 编号为 i 的士兵的初始战斗力为 xi ,一支特别行动队的初始战斗力 x 为队内 士兵初始战斗力之和,即 x = x_i + x_{i+1} + ... + x_{i+k}x=x?i??+x?i+1??+...+x?i+k??。 通过长期的观察,你总结出一支特别行动队的初始战斗力 x 将按如下经验公 式修正为 $x‘:x‘ = ax2 + bx + c$,其中 a, b, c 是已知的系数(a 例如,你有 4 名士兵, x_1 = 2, x_2 = 2, x_3 = 3, x_4 = 4x?1??=2,x?2??=2,x?3??=3,x?4??=4。经验公式中的参数为 a = –1, b = 10, c = –20。此时,最佳方案是将士兵组成 3 个特别行动队:第一队包含士兵 1 和士兵 2,第二队包含士兵 3,第三队包含士兵 4。特别行动队的初始战斗力分 别为 4, 3, 4,修正后的战斗力分别为 4, 1, 4。修正后的战斗力和为 9,没有其它 方案能使修正后的战斗力和更大。 输入格式: 输入由三行组成。第一行包含一个整数 n,表示士兵的总数。第二行包含三 个整数 a, b, c,经验公式中各项的系数。第三行包含 n 个用空格分隔的整数 $x_1, x_2, …, x_n$,分别表示编号为 1, 2, …, n 的士兵的初始战斗力。 输出格式: 输出一个整数,表示所有特别行动队修正后战斗力之和的最大值。 20%的数据中,n ≤ 1000; 50%的数据中,n ≤ 10,000; 100%的数据中,1 ≤ n ≤ 1,000,000,–5 ≤ a ≤ –1,|b| ≤ 10,000,000,|c| ≤ 10,000,000,1 ≤ xi ≤ 100。 斜率DP pro 2。相比上一题,本蒟蒻感觉这题水多了,只是调了一下才A。 设f[i]为前i个人的战斗力最大值,s[i]为前i个人战斗力的和。易得: f[i]=max{f[j]+a(s[i]-s[j])^2+b(s[i]-s[j])+c}(j =max{f[j]+as[i]^2-2as[i]s[j]+as[j]^2+bs[i]-bs[j]+c} 设X[i]=as[i]^2,Y[i]=bs[i],则原式 =max{f[j]+X[i]-2as[i]s[j]+X[j]+Y[i]-Y[j]+c} 设P[i]=X[i]+Y[i],Q[i]=X[i]-Y[i],则原式 =max{f[j]+P[i]+Q[i]-2as[i]s[j]+c} 则f[i]=?f[j]+P[i]+Q[i]-2as[i]s[j]+c 则在这个式子里,y=f[j]+Q[j],k=2as[i],x=s[j],b=f[i]-P[i]-c,且y=kx+b。 由于是取max,所以是维护一个上凸包,所以维护一个斜率只降不升的单调队列就可以了。 其中每个点的坐标为(xi,yi)=(s[i],f[i]+Q[i])(可以从最后那个x和y的表达式看出来)。 code: [luogu P3628] [APIO2010]特别行动队 标签:read 输入输出格式 for psu 最大 char col i++ lin 原文地址:http://www.cnblogs.com/whc200305/p/7656169.html[luogu P3628] [APIO2010]特别行动队
题目描述
输入输出格式
输入输出样例
4
-1 10 -20
2 2 3 4
9
说明
1 %:pragma GCC optimize(2)
2 #include
上一篇:WPF动画1---基础动画
文章标题:[luogu P3628] [APIO2010]特别行动队
文章链接:http://soscw.com/index.php/essay/83383.html