我们先把所有最左端对应的最优右端入堆,eg: z  在[l,r](由题目给出的L,R决定)之间的最优解 y,然后出堆以后,再入堆z,y-1,z,y+1,那么我们只需要用st找最大前缀和就好了(ST是一种用来解决RMQ问题的方法他的应用也就限于此了)

#include <cstdio>
#include <cstring>
#include <queue>
#define make(a,b,c,d) (DT){a,b,c,d}
#define MAXN 500000
using namespace std;
int bin[],st[MAXN+][],Log[MAXN+];
int n,k,L,R,s[MAXN+],a[MAXN+];
long long ans;
struct DT
{
int z,l,r,y;
bool operator < (const DT next)const { return s[next.y]-s[next.z-]>s[y]-s[z-]; }
};
inline int Min(int x,int y)
{
return x<y?x:y;
}
inline void pre()
{
bin[]=;for(register int i=;i<;i++)bin[i]=bin[i-]<<;
Log[]=-;for(register int i=;i<=n;i++)Log[i]=Log[i>>]+;
for(register int i=;i<=n;i++)st[i][]=i;
for(register int i=;i<;i++)
for(register int j=;j<=n;j++)
if(j+bin[i]-<=n) st[j][i]=s[st[j][i-]]>s[st[j+bin[i-]][i-]]?st[j][i-]:st[j+bin[i-]][i-];
}
priority_queue<DT> Q;
inline int query(int x,int y)
{
register int len=Log[y-x+];
return s[st[x][len]]>s[st[y-bin[len]+][len]]?st[x][len]:st[y-bin[len]+][len];
}
inline void Init()
{
scanf("%d%d%d%d",&n,&k,&L,&R);
for(register int i=;i<=n;i++)scanf("%d",&a[i]);
for(register int i=;i<=n;i++)s[i]=s[i-]+a[i];
pre();
for(register int i=,r;i<=n;i++)
if(i+L-<=n) r=Min(n,i+R-),Q.push(make(i,i+L-,r,query(i+L-,r)));
}
inline void Work()
{
while(k--)
{
DT x=Q.top();Q.pop();
ans+=s[x.y]-s[x.z-];
if(x.y->=x.l)Q.push(make(x.z,x.l,x.y-,query(x.l,x.y-)));
if(x.y+<=x.r)Q.push(make(x.z,x.y+,x.r,query(x.y+,x.r)));
}
printf("%lld",ans);
}
int main()
{
Init();
Work();
return ;
}

【BZOJ 2006】[NOI2010]超级钢琴 ST的更多相关文章

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

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

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

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

  3. BZOJ 2006: [NOI2010]超级钢琴 ST表+堆

    开始想到了一个二分+主席树的 $O(n\log^2 n)$ 的做法. 能过,但是太无脑了. 看了一下题解,有一个 ST 表+堆的优美解法. 你发现肯定是选取前 k 大最优. 然后第一次选的话直接选固定 ...

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

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

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

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

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

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

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

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

  8. bzoj 2006: [NOI2010]超级钢琴【st表+堆】

    设计一个五元组(i,l,r,p,v),表示在以i为左端点,右端点落在(l,r)中的情况下,取最大值v时右端点落在p.把这个五元组塞到优先队列里,以v排序,每次取出一个,然后把这个取过的五元组分成两个( ...

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

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

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

    [题解] 贪心题.设五元组(mx,pos,l,r1,r2)表示最大值为mx,取得最大值的区间右端点为pos,区间左端点为l,区间右端点的可选区间为[r1,r2]. 每次从堆里拎出最大值,然后把这个区间 ...

随机推荐

  1. 更新Composer依赖报错处理Fatal error: Declaration of Fxp\Composer\AssetPlugin\Repository\AbstractAssetsRe

    更新Composer依赖报错处理 Fatal error: Declaration of Fxp\Composer\AssetPlugin\Repository\AbstractAssetsRe po ...

  2. 让UltraEdit-32成为Delphi 7编译器的工具设置

    UltraEdit-32编译Delphi的工具设置 {================================================}Dcc32 命令行(&C):C:\Pro ...

  3. Json格式化时间

    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")@JsonFormat(timezone = "GMT+8", ...

  4. 最短路径算法 2.Dijkstra算法

    Dijkstra 算法解决的是带权重的有向图上单源最短路径问题,该算法要求所有边的权重都为非负值.该算法的时间复杂度是O(N2),相比于处理无负权的图时,比Bellmad-Ford算法效率更高. 算法 ...

  5. STL 入门 (17 暑假集训第一周)

    快速全排列的函数 头文件<algorithm> next_permutation(a,a+n) ---------------------------------------------- ...

  6. Hue 工具使用

    Hue 是一个 Web 接口的 Hadoop 分析数据工具,由 Cloudra 公司开源 官方网址 Github 地址 -> 安装方法 文档地址 一.Build 1.ubuntu安装所需环境(以 ...

  7. Django调试models输出的SQL语句

    django1.3在shell下,调试models变得更为简单了,不用像之前的版本,手工去调用django query,才能打印出之前的代码是执行的什么SQL语句. 1.3开始只需在settings. ...

  8. python os模块atime ,ctime,mtime意义

    ython的os.stat中主要的时间信息有三个:st_mtime,st_atime,st_ctime.   1.st_mtime:time of last modification      最后一 ...

  9. 触发显示和隐藏 div

    <script> window.onload = function(){ var oDiv1 = document.getElementById("div1"); va ...

  10. SpringBoot学习:使用logback进行日志记录

    项目下载地址:http://download.csdn.NET/detail/aqsunkai/9805821 (一)pom.xml文件中引入jar: <!-- https://mvnrepos ...