贪心 + 主席树 + 堆
题目描述
小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐。
这架超级钢琴可以弹奏出n个音符,编号为1至n。第i个音符的美妙度为Ai,其中Ai可正可负。
一个“超级和弦”由若干个编号连续的音符组成,包含的音符个数不少于L且不多于R。我们定义超级和弦的美妙度为其包含的所有音符的美妙度之和。两个超级和弦被认为是相同的,当且仅当这两个超级和弦所包含的音符集合是相同的。
小Z决定创作一首由k个超级和弦组成的乐曲,为了使得乐曲更加动听,小Z要求该乐曲由k个不同的超级和弦组成。我们定义一首乐曲的美妙度为其所包含的所有超级和弦的美妙度之和。小Z想知道他能够创作出来的乐曲美妙度最大值是多少。
输入格式
输入第一行包含四个正整数n, k, L, R。其中n为音符的个数,k为乐曲所包含的超级和弦个数,L和R分别是超级和弦所包含音符个数的下限和上限。
接下来n行,每行包含一个整数Ai,表示按编号从小到大每个音符的美妙度。
输出格式
输出只有一个整数,表示乐曲美妙度的最大值。
Inputs and Outputs examples
Inputs’ e.g. #1
1 | 4 3 2 3 |
Outputs’ e.g. #1
1 | 11 |
说明
所有数据满足:-1000 ≤ Ai ≤ 1000,1 ≤ L ≤ R ≤ n且保证一定存在满足要求的乐曲。
分析
其实一句话题意就是就是求出前$k$大的在$(l,r)$区间内的最大子串和.
我们发现这个题可以贪心一下,先找到最大值,然后把他删掉,然后接着找最大值.
然后我们枚举左端点$l$,我们发现对于给定的$l$,所有满足条件的$r$构成了一个区间.
显然我们要选区间的前缀和最大的$r$,因为一定要减去$l$的前缀和.
然后我们对于每一个给定的$l$,都求出了一个最大合法的子串和.
然后我们把这个值扔进堆里,就能得到最大值.
这个时候,我们发现很可能区间第二大就可能是当前最大值,那么我们把区间第二大扔进堆里,然后取出第二大就再插入第三大.
然后我们发现,这就是一个静态区间$k$大的问题,然后我们就可以来发主席树~
代码
1 | /* Headers */ |