洛谷 2048 BZOJ 2006 [NOI2010]超级钢琴

【题解】
贪心题。设五元组(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]超级钢琴的更多相关文章
- 洛谷 P2048 BZOJ 2006 [NOI2010]超级钢琴
题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中A ...
- BZOJ 2006: [NOI2010]超级钢琴
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2613 Solved: 1297[Submit][Statu ...
- Bzoj 2006: [NOI2010]超级钢琴 堆,ST表
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2222 Solved: 1082[Submit][Statu ...
- BZOJ 2006: [NOI2010]超级钢琴( RMQ + 堆 )
取最大的K个, 用堆和RMQ来加速... ----------------------------------------------------------------- #include<c ...
- BZOJ.2006.[NOI2010]超级钢琴(贪心 堆)
BZOJ 洛谷 思路和BZOJ3784一样,用前缀和+堆维护.做那题吧,不赘述啦. (没错我就是水一个AC) //54620kb 1060ms #include <queue> #incl ...
- BZOJ 2006 [NOI2010]超级钢琴 (堆+主席树)
题面:BZOJ传送门 洛谷传送门 让你求前$K$大的子序列和,$n\leq 5*10^{5}$ 只想到了个$nlog^{2}n$的做法,似乎要被卡常就看题解了.. 好神奇的操作啊,我傻了 我们把序列和 ...
- bzoj 2006 [NOI2010]超级钢琴——ST表+堆
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2006 每个右端点的左端点在一个区间内:用堆记录端点位置.可选区间,按价值排序:拿出一个后也许 ...
- BZOJ 2006 NOI2010 超级钢琴 划分树+堆
题目大意:给定一个序列.找到k个长度在[l,r]之间的序列.使得和最大 暴力O(n^2logn),肯定过不去 看到这题的第一眼我OTZ了一下午... 后来研究了非常久别人的题解才弄明确怎么回事...蒟 ...
- BZOJ 2006: [NOI2010]超级钢琴 [ST表+堆 | 主席树]
题意: 一个序列,求k个不相同的长度属于\([L,R]\)的区间使得和最大 前缀和,对于每个r找最小的a[l] 然后我yy了一个可持久化线段树做法...也许会T 实际上主席树就可以了,区间k小值 然后 ...
随机推荐
- bat 截取字符串(for命令) 推荐收藏
摘自:http://www.jb51.net/article/50354.htm 今天需要用批处理命令处理文件夹中的文件,需要用到bat中的for命令以及字符串截取的一些命令.在上面的链接中找到许多有 ...
- 'latin-1' codec can't encode characters in position解决字符问题
当遇到这样的报错时,原因是: pymysql库在处理mysql语句时,默认的编码方式是'latin-1',这种编码方式能识别的字符是有限的 解决办法:找到\site-packages\pymysql\ ...
- canvas学写一个字
第一步:画一个米字格,先画一个矩形,再画中间的米字. <script> window.onload = function(){ var canvas = document.getEleme ...
- 2016天池-O2O优惠券使用预测竞赛总结
第一次参加数据预测竞赛,发现还是挺有意思的.本文中的部分内容参考第一名“诗人都藏在水底”的解决方案. 从数据划分.特征提取.模型设计.模型融合/优化,整个业务流程得到了训练.作为新手在数据划分和模型训 ...
- md5加密、Des加密对称可逆加密、RSA非对称可逆加密、https单边验证、银行U盾双边认证
1.md5不可逆的加密方式,加密成一个32位的字符串.算法是公开的,任何语言的加密结果都是一样的.总有可能是重复的. 用途: (1)防止明文存储:可以用作密码加密 ...
- C#模拟百度登录并到指定网站评论回帖(三)
上次说到怎么获取BAIDUID,这个相信很多人都能够拿到就不多说了,今天一连说两个,获取token和raskey 2.利用以上获得的cookie直接访问页面 https://passport.baid ...
- 微信小程序授权 获取用户的openid和session_key【后端使用java语言编写】,我写的是get方式,目的是测试能否获取到微信服务器中的数据,后期我会写上post请求方式。
在这里给大家分享下我的心得,1.写代码前一定要对整个流程有个了解.我就是因为在先不了解整个过程中去ctrl+c+v他人的博客代码,花费很多无用的时间去处理还不知道能不能跑的起来的代码. 2.本人比较喜 ...
- mysql若干问题
一.Host ip is not allowed to connect to this MySql server 解决方法:这是因为你的账号不允许远程登录,只能在localhost.只要在localh ...
- JS高级——文件操作
https://www.cnblogs.com/mingmingruyuedlut/archive/2011/10/12/2208589.html https://blog.csdn.net/pl16 ...
- axios方法get及post代码示例
show: function(){ //get方式 //赋值给变量self var self = this; var url = "hotcity.json"; axios.get ...