[NOI2010]超级钢琴(RMQ+堆)
小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐。
这架超级钢琴可以弹奏出n个音符,编号为1至n。第i个音符的美妙度为Ai,其中Ai可正可负。
一个“超级和弦”由若干个编号连续的音符组成,包含的音符个数不少于L且不多于R。我们定义超级和弦的美妙度为其包含的所有音符的美妙度之和。两个超级和弦被认为是相同的,当且仅当这两个超级和弦所包含的音符集合是相同的。
小Z决定创作一首由k个超级和弦组成的乐曲,为了使得乐曲更加动听,小Z要求该乐曲由k个不同的超级和弦组成。我们定义一首乐曲的美妙度为其所包含的所有超级和弦的美妙度之和。小Z想知道他能够创作出来的乐曲美妙度最大值是多少。
Solution
题目需要求一个数列的前k大的字段和。
因为字段的左右端点都是移动的,我们不能直接维护这么一个东西,更不能把所有合法子段都加入堆中贪心。
考虑固定一个端点。
对于一个固定的左端点,最优的右端点是确定的(可以用ST表O(1)找出来)。
所以我们把所有左端点都加入堆中,每次取出最大值后,将(l—pos-1)和(pos+1—r)加入堆(pos是上一次最优点)。
Code
#include<cstdio>
#include<queue>
#include<cmath>
#include<iostream>
#define N 500002
using namespace std;
typedef long long ll;
ll sum[N],st[N][],ans;
int pos[N][],n,k,l,r,ji[N];
ll RMQ(int l,int r){
return max(st[l][ji[r-l+]],st[r-(<<ji[r-l+])+][ji[r-l+]]);
}
struct node{
int tag,l,r;
ll num;
bool operator < (const node &b)const{
return num<b.num;
}
};
priority_queue<node>q;
int main(){
scanf("%d%d%d%d",&n,&k,&l,&r);
for(int i=;i<=n;++i){scanf("%lld",&sum[i]);sum[i]+=sum[i-];st[i][]=sum[i];pos[i][]=i;}
for(int i=;i<=n;++i)ji[i]=log(i)/log();
for(int i=;(<<i)<=n;++i)
for(int j=;j<=n;++j){
st[j][i]=st[j][i-];pos[j][i]=pos[j][i-];
if(j+(<<i-)<=n&&st[j+(<<i-)][i-]>st[j][i]){
st[j][i]=st[j+(<<i-)][i-];
pos[j][i]=pos[j+(<<i-)][i-];;
}
}
for(int i=;i<=n;++i)
if(i+l-<=n)q.push(node{i,i+l-,min(i+r-,n),RMQ(i+l-,min(i+r-,n))-sum[i-]});
while(k--){
node x=q.top();q.pop();
int pp=ji[x.r-x.l+];
int po=pos[x.l][pp];
if(sum[pos[x.r-(<<pp)+][pp]]>sum[po])po=pos[x.r-(<<pp)+][pp];
ans+=x.num;
int lp=po-;
if(x.l<=lp)q.push(node{x.tag,x.l,lp,RMQ(x.l,lp)-sum[x.tag-]});
lp=po+;
if(lp<=x.r)q.push(node{x.tag,lp,x.r,RMQ(lp,x.r)-sum[x.tag-]});
}
printf("%lld",ans);
return ;
}
[NOI2010]超级钢琴(RMQ+堆)的更多相关文章
- BZOJ 2006: [NOI2010]超级钢琴( RMQ + 堆 )
取最大的K个, 用堆和RMQ来加速... ----------------------------------------------------------------- #include<c ...
- P2048 [NOI2010]超级钢琴 (RMQ,堆)
大意: 给定n元素序列a, 定义一个区间的权值为区间内所有元素和, 求前k大的长度在[L,R]范围内的区间的权值和. 固定右端点, 转为查询左端点最小的前缀和, 可以用RMQ O(1)查询. 要求的是 ...
- BZOJ2006 [NOI2010]超级钢琴 【堆 + RMQ】
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MB Submit: 3446 Solved: 1692 [Submit][Sta ...
- 洛谷P0248 [NOI2010] 超级钢琴 [RMQ,贪心]
题目传送门 超级钢琴 题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符 ...
- bzoj2006: [NOI2010]超级钢琴(堆+RMQ)
和上一道题同类型...都是用堆求第k大 考虑对于每一个r,怎么求出一个最优的l.显然只需要求出前缀和,用RMQ查询前面最小的l的前缀和就好了.但是对于一个r,每个l只能选一次,选了一次之后,考虑怎么把 ...
- 【BZOJ2006】[NOI2010] 超级钢琴(堆+RMQ)
点此看题面 大致题意: 要你求出区间和前\(k\)大的区间的区间和之和,其中每个区间的大小在\(L\)与\(R\)之间. 堆+\(RMQ\) 这道题目,我们可以先对\(1\sim n\)中的每一个\( ...
- BZOJ.2006.[NOI2010]超级钢琴(贪心 堆)
BZOJ 洛谷 思路和BZOJ3784一样,用前缀和+堆维护.做那题吧,不赘述啦. (没错我就是水一个AC) //54620kb 1060ms #include <queue> #incl ...
- [NOI2010] 超级钢琴 - 贪心,堆,ST表
这也算是第K大问题的套路题了(虽然我一开始还想了个假算法),大体想法就是先弄出最优的一批解,然后每次从中提出一个最优解并转移到一个次优解,用优先队列维护这个过程即可. 类似的问题很多,放在序列上的,放 ...
- P2048 [NOI2010]超级钢琴(RMQ+堆+贪心)
P2048 [NOI2010]超级钢琴 区间和--->前缀和做差 多次查询区间和最大--->前缀和RMQ 每次取出最大的区间和--->堆 于是我们设个3元组$(o,l,r)$,表示左 ...
- 【BZOJ 2006】2006: [NOI2010]超级钢琴(RMQ+优先队列)
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2792 Solved: 1388 Description 小 ...
随机推荐
- MongoDB——待整理
MongoDB mongoose——http://mongoosejs.com/ npm i mongoose Mongoose 通过外键与另一张表建立关联:Mongoose Populate 基本使 ...
- 3proxy使用方法
转自:DRL@fireinice写的教程 ******************************************************************************* ...
- window端编码到Linux允许脚本 笔记
昨天升级一个服务,发现没有现成的启动脚本.就随手写了一个,一运行发现不行.竟然报错说找不到文件,No such file or directory [nohup: cannot run command ...
- 4 HttpServletResponse 与 HttpServletRequest
Web 服务器收到一个http请求,会针对每个请求创建一个HttpServletRequest 和 HttpServletReponse 对象,response用于向客户端发送数据,request用于 ...
- Linux df 与du用法
df 查看一级目录的大小,但是不能查看文件的大小.du 可以查看目录或者文件大小. 1 df的基本用法 df命令可以显示目前所有文件系统的总空间及当前可用空间,用法如下: -a 全部文件系统列表-h ...
- [转帖]SAP一句话入门:Project System
SAP一句话入门:Project System http://blog.vsharing.com/MilesForce/A621279.html 这是SAP ERP入门的最后一篇了. 我们这些死跑龙套 ...
- 查看端口占用cmd命令
查看端口被占用的进程: 在任务管理器中结束进程:
- 布局管理器之BorderLayout(边界布局)
边界布局管理器把容器的的布局分为五个位置:CENTER.EAST.WEST.NORTH.SOUTH.依次对应为:上北(NORTH).下南(SOUTH).左西(WEST).右东(EAST),中(CENT ...
- NIO和经典IO
NIO未必更快,在Linux上使用Java6完成的测试中,多线程经典I/O设计胜出NIO30%左右 异步I/O强于经典I/O:服务器需要支持超大量的长期连接,比如10000个连接以上,不过各个客户端并 ...
- vue & iview
vue & iview ui components https://codepen.io/webgeeker/pen/EJmQxQ https://www.iviewui.com/docs/g ...