P2048 [NOI2010]超级钢琴

区间和--->前缀和做差

多次查询区间和最大--->前缀和RMQ

每次取出最大的区间和--->堆

于是我们设个3元组$(o,l,r)$,表示左端点为$o$,右端点在$l,r$之间(最优处为$t$)的最大区间和。

$t$可以RMQ在$l,r$间$O(1)$查询

所以我们事先把$n$个三元组(1<=o<=n)扔到堆里,每次把$s[t]-s[o-1]$最大的拿出来累加进答案。

取出来后$[o,t]$就不能取了,于是我们再把$(o,l,t-1)$和$(o,t+1,r)$再扔进堆里就好辣

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define rint register int
using namespace std;
inline int Min(int a,int b){return a<b?a:b;}
void read(int &x){
char c=getchar();x=; bool f=;
while(c<''||c>'') f=f&&(c!='-'),c=getchar();
while(''<=c&&c<='') x=x*+(c^),c=getchar();
x=f?x:-x;
}
#define N 500005
int n,k,s[N],f[][N],Log[N],a,L,R; long long ans;
void maketb(){//RMQ:f数组存的是最大值的下标
for(rint i=;i<=n;++i) f[][i]=i;
for(rint j=;(<<j)<=n;++j)
for(rint i=;i+(<<(j-))<=n;++i){
if(s[f[j-][i]]>s[f[j-][i+(<<(j-))]])
f[j][i]=f[j-][i];
else f[j][i]=f[j-][i+(<<(j-))];
}
}
int ask(int l,int r){
int k=Log[r-l+];
if(s[f[k][l]]>s[f[k][r-(<<k)+]]) return f[k][l];
else return f[k][r-(<<k)+];
}
struct data{
int o,l,r,t;
data(int A,int B,int C):
o(A),l(B),r(C),t(ask(B,C))
{}
bool operator < (const data &tmp) const{
return s[t]-s[o-]<s[tmp.t]-s[tmp.o-];
}
};priority_queue <data> h;
int main(){
read(n);read(k);read(L);read(R); Log[]=-;
for(rint i=;i<=n;++i) read(a),s[i]=s[i-]+a,Log[i]=Log[i>>]+;
maketb();
for(rint i=;i+L-<=n;++i) h.push(data(i,i+L-,Min(i+R-,n)));
while(k--){
data x=h.top(); h.pop();
ans+=s[x.t]-s[x.o-];
if(x.l<x.t) h.push(data(x.o,x.l,x.t-));
if(x.r>x.t) h.push(data(x.o,x.t+,x.r));
}printf("%lld",ans);
return ;
}

P2048 [NOI2010]超级钢琴(RMQ+堆+贪心)的更多相关文章

  1. P2048 [NOI2010]超级钢琴 (RMQ,堆)

    大意: 给定n元素序列a, 定义一个区间的权值为区间内所有元素和, 求前k大的长度在[L,R]范围内的区间的权值和. 固定右端点, 转为查询左端点最小的前缀和, 可以用RMQ O(1)查询. 要求的是 ...

  2. BZOJ 2006: [NOI2010]超级钢琴( RMQ + 堆 )

    取最大的K个, 用堆和RMQ来加速... ----------------------------------------------------------------- #include<c ...

  3. 洛谷P0248 [NOI2010] 超级钢琴 [RMQ,贪心]

    题目传送门 超级钢琴 题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符 ...

  4. 洛谷 P2048 [NOI2010]超级钢琴 解题报告

    P2048 [NOI2010]超级钢琴 题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为 ...

  5. 【题解】P2048 [NOI2010]超级钢琴

    [题解][P2048 NOI2010]超级钢琴 一道非常套路的题目.是堆的套路题. 考虑前缀和,我们要是确定了左端点,就只需要在右端区间查询最大的那个加进来就好了.\(sum_j-sum_{i-1}​ ...

  6. BZOJ2006 [NOI2010]超级钢琴 【堆 + RMQ】

    2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 552 MB Submit: 3446  Solved: 1692 [Submit][Sta ...

  7. [洛谷P2048] [NOI2010] 超级钢琴

    洛谷题目链接:[NOI2010]超级钢琴 题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号 ...

  8. [BZOJ2006] [NOI2010]超级钢琴 主席树+贪心+优先队列

    2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 3591  Solved: 1780[Submit][Statu ...

  9. LGOJ P2048 [NOI2010]超级钢琴

    题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中A ...

随机推荐

  1. NgDL:【第二周】NN基础

    1.计算图的导数计算 正向比如说是计算代价函数值,反向就是增大多少a/b/c对J的影响,也就是导数的意义,这里讲的是求导链式法则. 2.向量化 节约大量计算时间 简直是100倍的时间,看来之前实现的那 ...

  2. JFrame绝对布局

    通过代码:setLayout(null);设置容器布局为绝对布局. 添加控件要注意:一定要设置控件具体的位置.可通过代码setLocation(20, 20)或者setBounds(0, 0, 30, ...

  3. 【LeetCode每天一题】Remove Element(移除指定的元素)

    Given an array nums and a value val, remove all instances of that value in-place and return the new ...

  4. git 查看某个文件的修改记录

    有几种方式, (1)如果是在linux环境下,比如centos,ubuntu之类的,建议安装tig命令 炒鸡好用,tig后面可以跟文件或者文件夹,比如: (1.1)tig  dir_name (1.2 ...

  5. maven设置每次构建获取最新版本号

    build.gradle中的依赖是通过设置maven依赖实现.我们知道,maven可以说是通过一个坐标定位来确定唯一一个包的,所说的坐标定位分别是groupId,artifactId和version三 ...

  6. [LeetCode] 209. Minimum Size Subarray Sum_Medium

    Given an array of n positive integers and a positive integer s, find the minimal length of a contigu ...

  7. WebService/WCF/WebAPI 之间的区别

    Web Service 1.数据的格式基于SOAP协议 2.数据的传输只支持HTTP协议 3.它只能部署在IIS上 WCF 1.数据的格式基于SOAP协议 2.数据的传输支持HTTP,HTTPS,TC ...

  8. c#之如何正确地实现IDisposable接口

    见实例: public class TestClass : IDisposable { //供程序员显式调用的Dispose方法 public void Dispose() { //调用带参数的Dis ...

  9. uvm设计分析——callback

    uvm_callback,设计者在进行class的function设计时,有意留下的一些hook,总是遍历某个pool中的对象: 使用者在使用时,将实现添加到某个pool中: callback中,最重 ...

  10. git server 配置

    因为后面要采用Git代替Subversion,花了点时间配置了Git服务端和客户端,像以前一样,仍然基于最新的Ubuntu11.10 server/desktop系统. 感谢这几篇文章的作者: htt ...