分块大法好!!!
首先,我们考虑当 k 确定的时候如何求答案, 显然对于所有形如 [ak,(a+1)k) 的 值域区间, 最大值一定是最优的。
进一步观察发现, 这样的区间总个数只有 klnk 个.,所以我们考虑分块,
那么我 们可以在 O(n+klnk) 的时间复杂度内处理出一个块对于任意 k 的答案. 询 问时复杂度是 O(mS) 的, 取 S =√klnk 可以达到最优复杂度 O(n√klnk)。
标程如下
1 |
|
I see you!
分块大法好!!!
首先,我们考虑当 k 确定的时候如何求答案, 显然对于所有形如 [ak,(a+1)k) 的 值域区间, 最大值一定是最优的。
进一步观察发现, 这样的区间总个数只有 klnk 个.,所以我们考虑分块,
那么我 们可以在 O(n+klnk) 的时间复杂度内处理出一个块对于任意 k 的答案. 询 问时复杂度是 O(mS) 的, 取 S =√klnk 可以达到最优复杂度 O(n√klnk)。
标程如下
1 | #include <bits/stdc++.h> |