qwq

倍增替代二分的场景

AcWing 109

给定整数 \(m\),对序列 \(s\) 定义 \(f(s)\) 为从 \(s\) 中选出 \(m\) 对不交的数,最大化每对数之差的平方和。
给定长为 \(n\) 的序列 \(a\),希望把 \(a\) 分成若干段使得每段的 \(f\) 值都不超过 \(Lim\)。求最少分成几段。\(n\le 2\times 10^6\)

显然 \(f(S)\) 是排序后前后配对得到的结果。显然每段要尽量长。

直接二分求出接下来的右端点能延伸到哪里是失败的。

改为倍增,段长增加的时候把新的那一段排序后和前面归并,可以花 \(O(k\log k)\) 的时间延伸 \(O(k)\) 的长度;段长准备减少的时候把后面那一大段排序,每次 partition 成两部分即可,下面所有 partition 的复杂度都可以算在这一大段上,而这一大段的长度等于延伸出的一段的长度,复杂度就是对的。

posted @ 2024-02-28 19:20  CharlieVinnie  阅读(20)  评论(0编辑  收藏  举报