https://atcoder.jp/contests/abc305/tasks
Ex - Shojin
N个问题, 难度(Ai,Bi)
选择$D \in [1,N]$天 完成所有N个问题,即把N个问题分成D个连续非空子区间
疲劳x 每天初始 = 0,每天完成当前的区间中的问题
区间内问题顺序可以任意调整,每次完成一个问题后 x_new = A x_old+B
给定X, 问 min D, 使得 sum x_每天结束<= X
输出 (min D, 对于 min D时最小的sum x_每天结束)
n 2e5
X 1e8
ai [1,1e5]
1<= bi
sum bi <= X
3s
1024mb
我的思路
先说一天内,如果指定了区间
先i后j: $a_j(a_i x + b_i) + b_j$
先j后i: $a_i(a_j x + b_j) + b_i$
如果要 $a_j(a_i x + b_i) + b_j < a_i(a_j x + b_j) + b_i$
即 $a_j b_i + b_j < a_i b_j + b_i$
即 $(a_j-1) b_i < (a_i-1) b_j$
即 $\frac {a_j-1}{b_j} < \frac{a_i-1}{b_i}$
即每个元素 可以按照key = $-\frac{a-1}{b}$ 排序
反过来排序则是最大
问题其实变成对于给定D, 求min
对于min显然 随着D增加,min 单调递减,因为至少有一天两个问题,而后一个问题的额外代价 是 (Ax+B)-x = (A-1)x+B, 而单独放一天则是B, 而A>=1
有一个巨大的dp
dp[i][d]
以i结束,i前面划分了d天的 最小消耗
就是求 dp[n][min d] <= x
dp[i][d] = min(dp[j][d-1] + cost[j+1..i]), j<i
首先 状态就n^2,空间就n^2 ,转移看上去要n^2,时间就是n^4
先说能否降低到n^3, 也就是cost[i...j]
有没有什么快速的计算方法或者预处理
显然x=Ax+B可以用矩阵乘法表示
那么就可以用线段树按 上面 -(a-1)/b 的顺序 维护
一个区间就是区间内的变成 对应的矩阵,而区间外的 变成 单位矩阵
那么计算一个区间cost[i...j]
无非就是cost[i...j-1]
基础上让 j在线段树中对应的 变为对应矩阵再计算完整线段树的 矩阵乘法结果,
这样显然 循环 遍历i,j
能 n^2 log n 算出所有cost[i..j]
至少时间复杂度变成 n^3 + n^2 log n
感觉 还缺了什么数学性质
但对于相邻的两个区间,并不知道 相邻位置放在哪个区间好
因为并不知道 它 排序后的位置,
虽然可以 预估它放最前 和 最后的贡献变化,一个是预估,另一个是需要他前后的区间的信息