bzoj2006】的更多相关文章

http://www.lydsy.com/JudgeOnline/problem.php?id=2006 (题目链接) 题意 给出一个数列,在其中选出K个长度在${[L,R]}$之间的不同的区间,使得他们的和权值和最大. Solution 我们可以先处理处它的前缀和${sum}$,然后用ST表维护前缀和的区间最小值.做完这些预处理以后,我们从L for 到n,每次在区间${[i-R,i-L]}$中取出前缀和最小的${sum[M]}$,与${sum[i]}$相减,丢入堆中.之后我们每次取出堆顶元素…
Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2435  Solved: 1195 Description 小 Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中Ai可正可负. 一个“超级和弦”由若干个编号连续的音符组成,包含的音符个数不少于L且不多于R.我们定义超级和弦的美妙度为其包含的所有音符的美妙度之和.两…
[BZOJ2006]超级钢琴(主席树,优先队列) 题面 BZOJ 题解 既然是一段区间 首先就要变成单点 所以求一个前缀和 这个时候贪心很明显了: 枚举每一个点和可以和它组成一段的可行的点 全部丢进一个堆里面 取出最大的\(K\)个就行了 但是,很显然,我们做不到都取出来 所以,考虑怎么优化这个过程 每次堆里面对于每个点就先维护一个最大贡献 显然的,只有取出了最大贡献,才会取出次大贡献 那么,最大/次大/\(K\)大贡献怎么算? 一个点,能够和他组成和弦的是一个连续的区间 最大的贡献就是它和区间…
bzoj2006 [NOI2010]超级钢琴 给定一个序列,求长度在 \([L,\ R]\) 之间的区间和的前 \(k\) 大之和 \(n\leq5\times10^5,\ k\leq2\times10^5,\ |a_i|\leq10^3\) 贪心,堆 令状态 \((s,\ l,\ r)\) 表示左端点为 \(s\) ,右端点在 \([l,\ r]\) 中,使得区间和最大的右端点 容易发现 \(t=(s,\ l,\ r)\) 即为前缀和在 \([l,\ r]\) 中最大值的位置 假设每次都选最优…
[BZOJ2006]超级钢琴(主席树,优先队列) 题面 BZOJ 题解 既然是一段区间 首先就要变成单点 所以求一个前缀和 这个时候贪心很明显了: 枚举每一个点和可以和它组成一段的可行的点 全部丢进一个堆里面 取出最大的\(K\)个就行了 但是,很显然,我们做不到都取出来 所以,考虑怎么优化这个过程 每次堆里面对于每个点就先维护一个最大贡献 显然的,只有取出了最大贡献,才会取出次大贡献 那么,最大/次大/\(K\)大贡献怎么算? 一个点,能够和他组成和弦的是一个连续的区间 最大的贡献就是它和区间…
Portal --> bzoj2006 Solution 一开始看错题了..没有看到编号连续然后愣了好久== ​ 首先肯定是找最大的\(K\)个啦,然后具体怎么找的话..没有什么特别好的办法那就暴力一点,每次取最大值然后把它删掉然后再取这样 ​ 现在的问题是怎么找最大值 ​ 注意到一个很重要的点,因为这题要求一个和弦的音符编号是连续的一段(一个区间),所以我们可以按照区间的左端点分类,每一类形如\((st,l,r)\),表示左端点为\(st\),右端点\(\in[l,r]\)的区间集合,显然,当…
[BZOJ2006][NOI2010]超级钢琴 Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中Ai可正可负. 一个“超级和弦”由若干个编号连续的音符组成,包含的音符个数不少于L且不多于R.我们定义超级和弦的美妙度为其包含的所有音符的美妙度之和.两个超级和弦被认为是相同的,当且仅当这两个超级和弦所包含的音符集合是相同的. 小Z决定创作…
题意: 思路: 用三元组(i, l, r)表示右端点为i,左端点在[l, r]之间和最大的区间([l, r]保证是对于i可行右端点区间的一个子区间),我们用堆维护一些这样的三元组. 堆中初始的元素为每个i,并且[l, r]为这个i可行左端点的区间. 假如某次最大值为(i, l, r),并且j为那个和最大区间的左端点,那么需要往堆中加入两个三元组(i, l, j-1)和(i, j+1, r). 对于一个三元组,计算对应最大和的问题实际就是一个RMQ问题,可以通过Sparse Table在O(Nlo…
Description ​ 给定一个长度为n的区间,询问前k大的区间和,区间长度\(\in [L, R]\). $ n, k <= 500000$ Solution ​ 首先求前缀和.把一个区间拆成两个前缀和之差. ​ 对于一个固定的右端点.我们首先需要最小化左端点.那么我们就在题目条件允许的范围内先求出左端点最小的位置, 但是一个区间的次大值可能超过别的区间的最大值, 这很麻烦. ​ 开一个堆, 维护一个三元组(Pos, Kth, Val), 表示以Pos为右端点,本次查到区间第Kth大,值为…
1.题意:给一个序列,让你取出k个不同的区间,要求长度在之间,问所有区间和的最大值 2.分析:这道题拿过来就能知道是要拿出前k个最大的区间,我们思考最暴力的做法,就是把这个所有的区间枚举出来算,取出前k个最大的,这个思路的复杂度很高,达到 很明显,这会超时,我们尝试换个角度,我们维护一个大根堆我们枚举所有的区间的左端点,然后我在 这个区间中选一个区间最大的,和大根堆中的最小数比较,如果大,那就加入堆,然后比较次大的,这样的复杂度呢? 是不是感觉卵用没有,但是这个算法的复杂度远远达不到上界,虽然说…