[NOI2010] 超级钢琴

[NOI2010] 超级钢琴 - 洛谷P2048

第一个想法是类似 CF241B(因为刚做的),二分第 \(k\) 大的超级和弦的大小,计算数量,最后求和。check 应该可以离散化后树状数组解决,求和同理。时间复杂度:\(O(n \log V \log n)\)。大概率可以通过。

但这个题有更优秀的做法。观察到 \(k \le 5\times10^5\),而上面那个题 \(m\) 直接拉满了。实际上我们可以一个一个贪心的取出来。

具体的,我们令 \(F(x, l, r)\) 表示左端点为 \(x + 1\),右端点在 \([l, r]\) 时的和弦美妙度最大值。\(F(x,l, r) = \max\limits_{i = l}^r \{ s_i \} - s_x\)(其中 \(s\) 为前缀和数组),使用 ST 表可以 \(O(1)\) 求解。

我们每次使用优先队列找到最大的 \(F(x, l, r)\),把他挑出来就行了。假设对应的右端点下标为 \(p\),再把 \(F(x, l, p - 1), F(x, p + 1, r)\) 在加进去即可。

时间复杂度:\(O(k \log n)\)

因为 \(k\) 只有 \(5 \times 10^5\) 的特殊性,可以暴力一个一个挑出来,运用了一个经典的使用优先队列的小 trick 贪心。

实际上前面那个题也可以这样做,配合可以持久化 01 tire 搞出一个 \(O(m (\log n + \log V))\) 的做法。

posted @ 2025-12-19 22:20  xiehanrui0817  阅读(0)  评论(0)    收藏  举报