CF1603C
这题 2300?纯唐吧,2700 还差不多。
考虑对于一段区间如何计算贡献。
假设 \(a_i\) 分裂出来 \(b_1,b_2,\dots,b_k\),不难发现尽可能均摊一定最优,即分裂成 \(\lfloor\dfrac{a_i}{k}\rfloor,\lfloor\dfrac{a_i}{k}\rfloor,\dots,\lceil\dfrac{a_i}{k},\lceil\dfrac{a_i}{k}\rceil\)。此时的 \(b_k\) 在分裂 \(k\) 次的情况下是最小的,\(b_1\) 在分裂 \(k\) 次的情况下是最大的。对于不同的分裂次数,可以发现一定是尽可能少分裂,分裂次数少的基础上还使得 \(b_1\) 尽可能大。于是就有一个从后往前贪心的思路,时间复杂度 \(O(n^2\log n)\),利用二分来找最少的分裂次数。
先尝试去掉二分,做到 \(O(n^2)\) 的复杂度。设后面第一个数为 \(v\),那么就是求使得 \(\lceil\dfrac{a_i}{k}\rceil\le v\) 成立的最小的 \(k\)。类似下取整的,猜测最大的 \(k\) 即为 \(\lceil\dfrac{a_i}{v}\rceil\)。
考虑 \(\lceil\dfrac{a_i}{k}\rceil\) 的一个基本性质就是随着 \(k\) 的增大,\(\lceil\dfrac{a_i}{k}\rceil\) 不升。设存在:
那么就是证明 \(p'\le v\),\(p''>v\)。先证明前者,反证,令 \(p>v\)。根据上取整函数的定义,有:
利用放缩进行证明。由于 \(p'>v\),进行替换得到 \((v-1)p<a_i\)。结合上 \(a_i\le pv\),得到 \(\lceil\dfrac{a_i}{p}\rceil=v\),即 \(p'=v\),不成立。注意这并不能证明 \(\lceil\dfrac{a_i}{\lceil\dfrac{a_i}{v}\rceil}\rceil=v\),因为前提条件就是错的。
\(p''>v\) 则十分类似,反证后使用放缩法不难得到 \(a_i\le (p-1)v\) 这一与前面矛盾的结论。
因此利用反证+放缩法简单地证明了使得 \(\lceil\dfrac{a_i}{k}\rceil\le v\) 成立的最小的 \(k\) 即为 \(\lceil\dfrac{a_i}{v}\rceil\)。于是就可以去掉二分做到 \(O(n^2)\)。观察到若 \(v\) 确定,那么 \(a_i\) 的分裂次数 \(\lceil\dfrac{a_i}{v}\rceil\) 就会确定下来,而根据整除分块的结论,不同的分裂次数只会有 \(O(\sqrt{V})\) 种。因此利用向上取整的整除分块枚举 \(v\),设 \(f_{i,j}\) 代表以 \(a_i\) 开头的子串中 \(a_i\) 最后分裂得到的最小值为 \(j\) 的方案数,利用 \(f_{i+1}\) 进行转移。
这实际上记的是一个方案数,考虑如何得到答案,有 \(f_{i,j}\) 个以 \(a_i\) 开头的子串会使 \(a_i\) 分裂一定次数(设为 \(c\)),同时,对于所有的 \(1\le x\le i\),以 \(x\) 开头的对应子串都会使 \(a_i\) 分裂 \(c\) 次(我们是从后往前贪心的),因此答案需要加上 \(i\times c\times f_{i,j}\)。时间复杂度 \(O(n\sqrt{V})\),用数据结构维护求和可能会多个 \(\log\)。
关于向上整除的整除分块
向下整除的整除分块有经典结论,对于 \(i\),其所在块的右端点为 \(\lfloor\dfrac{n}{\lfloor\dfrac{n}{i}\rfloor}\rfloor\)。
而对于向上整除的整除分块,\(i\) 所在块的右端点为 \(\lfloor\dfrac{n-1}{\lfloor\dfrac{n-1}{i}\rfloor}\rfloor\)。