[NOI2010] 超级钢琴
第一个想法是类似 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))\) 的做法。
浙公网安备 33010602011771号