题解:CF1603C Extreme Extension

题意:很简单了不再赘述。

做法:

首先我们考虑怎么分最优,发现如果我们现在是一个 \(x\),前一个是 \(y\),那么我们肯定要使留下的尽量大,并且这样分的段数也更少,可以发现我们应该把他分成 \(\lceil \frac{x}y\rceil\) 这么多段,然后平均分。

那么很自然地,我们设 \(dp_{i,x}\) 代表从后往前考虑,当前考虑到了第 \(i\) 个数,并且剩下的数是 \(x\),那么我们转移就是直接枚举下一个数是多少就可以,但是显然复杂度爆炸。

当我们扫到 \(i\) 的时候,如果我们枚举状态显然太慢了,但是我们注意到这里由于整除分块的性质,可能的状态只有 \(O(\sqrt n)\) 个,所以我们不妨枚举我们分成多少段及分出来的数是多少。

如果我们枚举我们上一步的数是 \([l,r]\),,其中这一段分出来的段数是一样的,设为 \(t = \lceil\frac{a_i}l\rceil\),我们就可以算出来分出来的数最小值是多少,假设是 \(v\)。我们就令 \(f_{i+1,[l,r]}\)\(f_{i,v}\) 转移。

但是我们还需要求答案,所有区间的这个答案值怎么求。

我们考虑在转移的时候算,当 \([l,r]\)\(f_{i,v}\) 转移时,我们给答案加上 \(i\times(t-1)f_{i,v}\),第一个 \(i\) 是因为对于所有的左端点 \([1,i]\) 都需要计算一次贡献,\(t-1\) 是因为 \(t\) 段需要 \(t-1\) 次分裂,\(f_{i,v}\) 就是因为有这么多个段需要 \(a_i\) 分裂出 \(t\) 段。

注意当分的段数为 \(1\) 时,要额外加上开头为 \(a_i\) 的,代表这里新开一段。

按上面转移即可。

posted @ 2025-07-30 15:59  LUlululu1616  阅读(10)  评论(0)    收藏  举报