【题解】

  贪心题。设五元组(mx,pos,l,r1,r2)表示最大值为mx,取得最大值的区间右端点为pos,区间左端点为l,区间右端点的可选区间为[r1,r2]. 每次从堆里拎出最大值,然后把这个区间拆了,因为选了[l,pos]这个区间之后就不能再选它了。我们得往堆了丢俩新的五元组(mx',pos',l,r1,pos-1)以及(mx'',pos'',l,pos+1,r2),至于mx',mx'',pos',pos''的获得,用ST表即可。

  

 #include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define N 1000010
#define rg register
#define LL long long
using namespace std;
int n,k,L,R,tot,pos[][N],f[][N];
LL ans;
struct heap{
LL d,p,l,r1,r2;
}h[N];
struct rec{
LL d,p;
};
inline int read(){
int k=,f=; char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(''<=c&&c<='')k=k*+c-'',c=getchar();
return k*f;
} inline void up(int x){
int fa;
while((fa=x>>)&&h[fa].d<h[x].d) swap(h[fa],h[x]),x=fa;
}
inline void down(int x){
int son;
while((son=x<<)<=tot){
if(son<tot&&h[son+].d>h[son].d) son++;
if(h[son].d>h[x].d) swap(h[son],h[x]),x=son;
else return;
}
}
inline rec query(int l,int r){
r=min(r,n); l=max(,l);
int k=log2(r-l+); rec tmp; tmp.d=tmp.p=;
if(l>r) return tmp;
if(f[k][l]>f[k][r-(<<k)+]){
tmp.d=f[k][l]; tmp.p=pos[k][l];
return tmp;
}
else{
tmp.d=f[k][r-(<<k)+]; tmp.p=pos[k][r-(<<k)+];
return tmp;
}
}
int main(){
memset(f,,sizeof(f)); f[][]=;
n=read(); k=read(); L=read()-; R=read()-;
for(rg int i=;i<=n;i++) f[][i]=read()+f[][i-],pos[][i]=i;
for(rg int i=;i<=log2(n);i++)
for(rg int j=;j<=n-(<<i)+;j++)
if(f[i-][j]>f[i-][j+(<<(i-))])
f[i][j]=f[i-][j],pos[i][j]=pos[i-][j];
else f[i][j]=f[i-][j+(<<(i-))],pos[i][j]=pos[i-][j+(<<(i-))];
for(rg int i=;i<=n-L;i++){
rec tmp=query(i+L,i+R);
h[++tot]=(heap){tmp.d-f[][i-],tmp.p,i,i+L,min(n,i+R)};
up(tot);
}
for(rg int i=;i<=k;i++){
heap now=h[];
ans+=now.d;
h[]=h[tot--]; if(tot) down();
if(now.p->=now.r1){
rec tmp=query(now.r1,now.p-);
h[++tot]=(heap){tmp.d-f[][now.l-],tmp.p,now.l,now.r1,now.p-};
up(tot);
}
if(now.r2>=now.p+){
rec tmp=query(now.p+,now.r2);
h[++tot]=(heap){tmp.d-f[][now.l-],tmp.p,now.l,now.p+,now.r2};
up(tot);
}
}
printf("%lld\n",ans);
return ;
}

洛谷 2048 BZOJ 2006 [NOI2010]超级钢琴的更多相关文章

  1. 洛谷 P2048 BZOJ 2006 [NOI2010]超级钢琴

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

  2. BZOJ 2006: [NOI2010]超级钢琴

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

  3. Bzoj 2006: [NOI2010]超级钢琴 堆,ST表

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

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

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

  5. BZOJ.2006.[NOI2010]超级钢琴(贪心 堆)

    BZOJ 洛谷 思路和BZOJ3784一样,用前缀和+堆维护.做那题吧,不赘述啦. (没错我就是水一个AC) //54620kb 1060ms #include <queue> #incl ...

  6. BZOJ 2006 [NOI2010]超级钢琴 (堆+主席树)

    题面:BZOJ传送门 洛谷传送门 让你求前$K$大的子序列和,$n\leq 5*10^{5}$ 只想到了个$nlog^{2}n$的做法,似乎要被卡常就看题解了.. 好神奇的操作啊,我傻了 我们把序列和 ...

  7. bzoj 2006 [NOI2010]超级钢琴——ST表+堆

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2006 每个右端点的左端点在一个区间内:用堆记录端点位置.可选区间,按价值排序:拿出一个后也许 ...

  8. BZOJ 2006 NOI2010 超级钢琴 划分树+堆

    题目大意:给定一个序列.找到k个长度在[l,r]之间的序列.使得和最大 暴力O(n^2logn),肯定过不去 看到这题的第一眼我OTZ了一下午... 后来研究了非常久别人的题解才弄明确怎么回事...蒟 ...

  9. BZOJ 2006: [NOI2010]超级钢琴 [ST表+堆 | 主席树]

    题意: 一个序列,求k个不相同的长度属于\([L,R]\)的区间使得和最大 前缀和,对于每个r找最小的a[l] 然后我yy了一个可持久化线段树做法...也许会T 实际上主席树就可以了,区间k小值 然后 ...

随机推荐

  1. Java:EL表达式

    ylbtech-Java:EL表达式 EL(Expression Language) 是为了使JSP写起来更加简单.表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 ...

  2. mysql通用分页存储过程遇到的问题(转载)

    mysql通用分页存储过程遇到的问题(转载) http://www.cnblogs.com/daoxuebao/archive/2015/02/09/4281980.html

  3. 10.27night清北刷题班

    /* 枚举每个部分的总和,利用前缀和进行检验. 如果能分成4部分就一定能分成2部分,就筛了一边素数优化.清空数组!!! */ #include<bits/stdc++.h> #define ...

  4. SSH协议、HTTPS中SSL协议的完整交互过程

    1.(SSH)公私钥认证原理 服务器建立公钥:每一次启动sshd服务时,该服务会主动去找/etc/ssh/ssh_host*的文件 客户端通过ssh工具进行连接,如Xshell,SecureCRT 服 ...

  5. $CF55D [数位DP]$

    题面 数位DP+状压. 首先,按照数位DP的基本套路,每个个位数的最小公倍数为2520,所以只用考虑模2520的情况.考虑一个DP.dp[i][j][k]表示当前是第i位,2~9的数的集合为j,模25 ...

  6. 三分 POJ 2420 A Star not a Tree?

    题目传送门 /* 题意:求费马点 三分:对x轴和y轴求极值,使到每个点的距离和最小 */ #include <cstdio> #include <algorithm> #inc ...

  7. Android 性能优化(27)*zipalign让apk数据对齐,运行更快。

    1.zipalign 简介 zipalign is an archive alignment tool that provides important optimization to Android ...

  8. vue+elementUI table篇

    1.table内容展示 <el-table stripe :key='tableKey' header-cell-class-name="bindonce" :data=&q ...

  9. 专题九:实现类似QQ的即时通信程序

    引言: 前面专题中介绍了UDP.TCP和P2P编程,并且通过一些小的示例来让大家更好的理解它们的工作原理以及怎样.Net类库去实现它们的.为了让大家更好的理解我们平常中常见的软件QQ的工作原理,所以在 ...

  10. Java多线程——线程之间的协作

    Java多线程——线程之间的协作 摘要:本文主要学习多线程之间是如何协作的,以及如何使用wait()方法与notify()/notifyAll()方法. 部分内容来自以下博客: https://www ...