P2048 [NOI2010]超级钢琴(RMQ+堆+贪心)
区间和--->前缀和做差
多次查询区间和最大--->前缀和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+堆+贪心)的更多相关文章
- P2048 [NOI2010]超级钢琴 (RMQ,堆)
大意: 给定n元素序列a, 定义一个区间的权值为区间内所有元素和, 求前k大的长度在[L,R]范围内的区间的权值和. 固定右端点, 转为查询左端点最小的前缀和, 可以用RMQ O(1)查询. 要求的是 ...
- BZOJ 2006: [NOI2010]超级钢琴( RMQ + 堆 )
取最大的K个, 用堆和RMQ来加速... ----------------------------------------------------------------- #include<c ...
- 洛谷P0248 [NOI2010] 超级钢琴 [RMQ,贪心]
题目传送门 超级钢琴 题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符 ...
- 洛谷 P2048 [NOI2010]超级钢琴 解题报告
P2048 [NOI2010]超级钢琴 题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为 ...
- 【题解】P2048 [NOI2010]超级钢琴
[题解][P2048 NOI2010]超级钢琴 一道非常套路的题目.是堆的套路题. 考虑前缀和,我们要是确定了左端点,就只需要在右端区间查询最大的那个加进来就好了.\(sum_j-sum_{i-1} ...
- BZOJ2006 [NOI2010]超级钢琴 【堆 + RMQ】
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MB Submit: 3446 Solved: 1692 [Submit][Sta ...
- [洛谷P2048] [NOI2010] 超级钢琴
洛谷题目链接:[NOI2010]超级钢琴 题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号 ...
- [BZOJ2006] [NOI2010]超级钢琴 主席树+贪心+优先队列
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 3591 Solved: 1780[Submit][Statu ...
- LGOJ P2048 [NOI2010]超级钢琴
题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中A ...
随机推荐
- 虚拟IP技术
虚拟IP技术在高可用领域像数据库SQLSERVER.web服务器等场景下使用很多,很疑惑它是怎么实现的,偶然,发现了一种方式可以实现虚拟ip.它的原理在于同一个物理网卡,是可以拥有多个ip地址的,至于 ...
- 命令行方式调用winrar对文件夹进行zip压缩示例代码
调用winRAR进行压缩 using System; using System.Collections.Generic; using System.Linq; using System.Text; u ...
- 数据分析与挖掘 - R语言:多元线性回归
一个简单的例子!环境:CentOS6.5Hadoop集群.Hive.R.RHive,具体安装及调试方法见博客内文档. 线性回归主要用来做预测模型. 1.准备数据集: X Y 0.10 42.0 0.1 ...
- linux统计文件夹大小
统计总大小: du -sh dirname 统计文件夹内部各文件大小及总大小: du -h dirname
- unity3d生命周期
- gulp打包公共部分
安装gulp cnpm install gulp -g 输入gulp -v看到版本号说明安装成功了 安装gulp-file-include:npm install gulp-file-include ...
- 【Spring学习笔记-MVC】Spring MVC之多文件上传 (zhan)
http://www.cnblogs.com/ssslinppp/p/4607330.html (zhan)
- 十二 总结JS原型
基本概念: 对象:属性和方法的集合(变量和函数的封装). 构造器函数:用于创建对象的函数,通过new关键字生成对象.函数名一般首字母大写的. 原型对象:每个函数都有一个prototype属性,它是一个 ...
- python django简单的登陆实现
实现方法: 1,可以先定义一个基础的页面访问路径 例如:http://127.0.0.1:8000/index/ 定义index路径 在urls urlpatterns = [ url(r'^ind ...
- hdu 5126 cdq+Treap+BIT
这题说的是给了三维空间然后操作 寻求在 x1,y1,z1 x2, y2, z2; (x1<x2, y1<y2,z1<z2) 计算出在 以这两个端点为右下和左上端点的方体内的点的 ...