引入
考虑一个 d p dp dp 方程: d p [ i ] = M i n / M a x ( a [ i ] ∗ b [ j ] + c [ i ] + d [ j ] ) dp[i]=Min/Max(a[i]*b[j]+c[i]+d[j]) dp[i]=Min/Max(a[i]∗b[j]+c[i]+d[j])
单调队列优化就没用了,所以引入斜率优化。
例题(青春猪头少年不会…)
题目大意
定义一个序列的可爱值为 ∑ i = 1 n a i ∗ i \sum_{i=1}^na_i*i ∑i=1nai∗i ,现在可以选一个值拿出,再重新插入到序列的任意位置,求最大可爱值。
2 ≤ n ≤ 3 ∗ 1 0 5 , 0 ≤ ∣ v i ∣ ≤ 1 0 6 2\le n\le3*10^5,0\le|v_i|\le10^6 2≤n≤3∗105,0≤∣vi∣≤106
题解
考虑把 a i a_i ai 放到 j j j 去,那么显然 i i i 以前的贡献不变, j j j 以后的贡献不变。
那么 c u t e ′ = c u t e + ( j − i ) ∗ a i − ( s j − s i ) {cute}^{'}=cute+(j-i)*a_i-(s_j-s_i) cute′=cute+(j−i)∗ai−(sj−si)
我们要求的就是 c u t e + M a x ( a i ∗ j − s j − a i ∗ i + s i ) cute+Max(a_i*j-s_j-a_i*i+s_i) cute+Max(ai∗j−sj−ai∗i+si)
定义 f [ i ] f[i] f[i] 是拿出 a i a_i ai 的最大值。
则 f [ i ] = c u t e − a i ∗ i + s i + M a x ( a i ∗ j − s j ) f[i]=cute-a_i*i+s_i+Max(a_i*j-s_j) f[i]=cute−ai∗i+si+Max(ai∗j−sj)
考虑斜率优化,令 j 1 j_1 j1 比 j 2 j_2 j2 优。
则有 a i ∗ j 1 − s j 1 ≥ a i ∗ j 2 − s j 2 a_i*j_1-s_{j_1}\ge a_i*j_2-s_{j_2} ai∗j1−sj1≥ai∗j2−sj2
a i ∗ ( j 1 − j 2 ) ≥ s j 1 − s j 2 a_i*(j_1-j_2)\ge s_{j_1}-s_{j_2} ai∗(j1−j2)≥sj1−sj2
即 s j 1 − s j 2 j 1 − j 2 ≤ a i {{s_{j_1}-s_{j_2}}\over{j_1-j_2}}\le a_i j1−j2sj1−sj2≤ai 所以 P i ( i , s i ) P_i(i,s_i) Pi(i,si)
然后按 P i P_i Pi 维护上凸壳,二分查找即可。
但是注意到 j j j 可能大于 i i i ,所以正反要做两遍。
a n s = M a x ( f [ i ] ) ans=Max(f[i]) ans=Max(f[i])
( f [ i ] f[i] f[i] 仅供理解用,实际并不需要)
代码
没调出来
方法总结
形如 d p [ i ] = M i n / M a x ( a [ i ] ∗ b [ j ] + c [ i ] + d [ j ] ) dp[i]=Min/Max(a[i]*b[j]+c[i]+d[j]) dp[i]=Min/Max(a[i]∗b[j]+c[i]+d[j]) ,又满足一些条件的方程都可以考虑斜优,先推式子,转化为计算几何,之后可以考虑单调性、二分、三分等方法快速求解。