【题解】

  贪心题。设五元组(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. POJ 3734 Blocks 矩阵递推

    POJ3734 比较简单的递推题目,只需要记录当前两种颜色均为偶数, 只有一种颜色为偶数 两种颜色都为奇数 三个数量即可,递推方程相信大家可以导出. 最后来个快速幂加速即可. #include< ...

  2. springmvc 用fasterxml.jackson返回son数据

    一,引入fasterxm.jackson包 <dependency> <groupId>com.fasterxml.jackson.core</groupId> & ...

  3. E20170602-ts

    questionnaire  n. 调查问卷; 调查表;  アンケート不是英语 collection   n. 征收; 收集,采集; 收藏品; 募捐; association   n. 联想; 协会, ...

  4. bzoj 4809: 皇后【dfs】

    爆搜卡线过 并不知道正解是啥 #include<iostream> #include<cstdio> using namespace std; const int N=40; ...

  5. bzoj 4756: [Usaco2017 Jan]Promotion Counting【dfs+树状数组】

    思路还是挺好玩的 首先简单粗暴的想法是dfs然后用离散化权值树状数组维护,但是这样有个问题就是这个全局的权值树状数组里并不一定都是当前点子树里的 第一反应是改树状数组,但是显然不太现实,但是可以这样想 ...

  6. bzoj 1232: [Usaco2008Nov]安慰奶牛cheer【最小生成树】

    有趣 每条边在算答案的时候被算了二倍的边权值加上两个端点的权值,然后睡觉点额外加一次 所以可以用这个权做MST,然后加上点权最小的点 #include<iostream> #include ...

  7. [Usaco2018 Open]Milking Order

    Description Farmer John的N头奶牛(1≤N≤10^5),仍然编号为1-N,正好闲得发慌.因此,她们发展了一个与Farmer John每天早上为她们挤牛奶的时候的排队顺序相关的复杂 ...

  8. 贪心 Codeforces Round #191 (Div. 2) A. Flipping Game

    题目传送门 /* 贪心:暴力贪心水水 */ #include <cstdio> #include <algorithm> #include <cstring> us ...

  9. sql删除表中重复记录只保留一条记录

    最终代码 update T_Fee set gzl_dfg_op = 'delete' where MetReadRecordID in ( select MetReadRecordID from T ...

  10. LN : leetcode 231 Power of Two

    lc 231 Power of Two 231 Power of Two Given an integer, write a function to determine if it is a powe ...