开始想到了一个二分+主席树的 $O(n\log^2 n)$ 的做法.

能过,但是太无脑了.

看了一下题解,有一个 ST 表+堆的优美解法.

你发现肯定是选取前 k 大最优.

然后第一次选的话直接选固定左端点,最优的右端点就行.

但是呢,这个右端点选完后就不能再选了,于是你把这个区间分成两个,再扔到堆里,这么迭代就行.

code:

#include <bits/stdc++.h>
#define LOG 20
#define N 500005
#define ll long long
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
ll sum[N],MIN[N][LOG];
namespace RMQ
{
void init(int n)
{
for(int i=1;i<=n;++i) MIN[i][0]=i;
for(int j=1;(1<<j)<=n;++j)
{
for(int i=1;i+(1<<j)-1<=n;++i)
{
int x=MIN[i][j-1], y=MIN[i+(1<<(j-1))][j-1];
MIN[i][j]=sum[x]>sum[y]?x:y;
}
}
}
int query(int l,int r)
{
int k=log2(r-l+1);
int x=MIN[l][k], y=MIN[r-(1<<k)+1][k];
return sum[x]>sum[y]?x:y;
}
};
struct element
{
int o,l,r,t;
element() {}
element(int o,int l,int r):o(o),l(l),r(r),t(RMQ::query(l,r)){}
friend bool operator<(const element&a,const element &b)
{
return sum[a.t]-sum[a.o-1]<sum[b.t]-sum[b.o-1];
}
};
priority_queue<element>Q;
int main()
{
// setIO("input");
int n,k,L,R,i,j;
scanf("%d%d%d%d",&n,&k,&L,&R);
for(i=1;i<=n;++i)
{
scanf("%lld",&sum[i]);
sum[i]+=sum[i-1];
}
RMQ::init(n);
for(i=1;i<=n;++i)
{
if(i+L-1<=n) Q.push(element(i,i+L-1,min(i+R-1,n)));
}
ll ans=0;
while(k--)
{
int o=Q.top().o,l=Q.top().l,r=Q.top().r,t=Q.top().t;
Q.pop();
ans+=sum[t]-sum[o-1];
if(l!=t) Q.push(element(o,l,t-1));
if(t!=r) Q.push(element(o,t+1,r));
}
printf("%lld\n",ans);
return 0;
}

  

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. [BZOJ2006][NOI2010]超级钢琴(ST表+堆)

    2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 3679  Solved: 1828[Submit][Statu ...

  4. 【BZOJ2006】[NOI2010]超级钢琴 ST表+堆

    [BZOJ2006][NOI2010]超级钢琴 Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以 ...

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

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

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

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

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

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

  8. 【BZOJ-2006】超级钢琴 ST表 + 堆 (一类经典问题)

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

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

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

随机推荐

  1. Python之路【第十篇】:Python面向对象之多态、多态性

    阅读目录 一 多态 多态指的是一类事物有多种形态 动物有多种形态:人,狗,猪 import abc class Animal(metaclass=abc.ABCMeta): #同一类事物:动物 @ab ...

  2. Git diff (---和+++具体解释)(转)

    转自:https://blog.csdn.net/lovezbs/article/details/46492933

  3. React+SpringBoot项目部署

    静态资源访问配置 https://www.jianshu.com/p/b6e0a0df32ec https://segmentfault.com/q/1010000012240531/a-102000 ...

  4. Java操作JSON数据(2)--Gson操作JSON数据

    Gson是Google公司发布的一个开发源码的Java库,可用于将Java对象转换为JSON字符串,也可用于将JSON字符串转换为对应的Java对象.本介绍下Gson的基本使用方法,包括序列化和反序列 ...

  5. 协程和Goroutines示例

    一. 协程的定义 Coroutines are computer-program components that generalize subroutines for non-preemptive m ...

  6. 【转载】C#使用Newtonsoft.Json组件来序列化对象

    在Asp.Net网站开发的过程中,很多时候会遇到对象的序列化和反序列化操作,Newtonsoft.Json组件是专门用来序列化和反序列化操作的一个功能组件,引入这个DLL组件后,就可使用JsonCon ...

  7. canvas教程(一) 简介

    什么是 canvas 按例是要介绍一下 canvas 的,在没有 canvas 之前,我们为了网页的效果,很多情况下是使用了图片来实现,不过用图片就需要加载,而且图片的体积也是一个问题,所以在 htm ...

  8. JS中的七大数据类型

    js中有7种数据类型,包括五种基本数据类型(Number,String,Boolean,Undefined,Null),和一种复杂数据类型(Object)以及es6语法新增的Symbol数据类型 es ...

  9. Python学习日记(二十七) 反射和几个内置函数

    isinstance() 判断isinstance(obj,cls)中obj是否是cls类的对象 class Person: def __init__(self,name): self.name = ...

  10. thrift简单示例 (基于C++)

    这个thrift的简单示例, 来源于官网 (http://thrift.apache.org/tutorial/cpp), 因为我觉得官网的例子已经很简单了, 所以没有写新的示例, 关于安装的教程, ...