题目描述 Description

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

这架超级钢琴可以弹奏出n个音符,编号为1至n。第i个音符的美妙度为Ai,其中Ai可正可负。

一个“超级和弦”由若干个编号连续的音符组成,包含的音符个数不少于L且不多于R。我们定义超级和弦的美妙度为其包含的所有音符的美妙度之和。两个超级和弦被认为是相同的,当且仅当这两个超级和弦所包含的音符集合是相同的。

小Z决定创作一首由k个超级和弦组成的乐曲,为了使得乐曲更加动听,小Z要求该乐曲由k个不同的超级和弦组成。我们定义一首乐曲的美妙度为其所包含的所有超级和弦的美妙度之和。小Z想知道他能够创作出来的乐曲美妙度最大值是多少。

输入描述 Input Description

输入文件第一行包含四个正整数n, k, L, R。其中n为音符的个数,k为乐曲所包含的超级和弦个数,L和R分别是超级和弦所包含音符个数的下限和上限。

接下来n行,每行包含一个整数Ai,表示按编号从小到大每个音符的美妙度。

输出描述 Output Description

输出文件只有一个整数,表示乐曲美妙度的最大值。

样例输入 Sample Input

4 3 2 3

3

2

-6

8

样例输出 Sample Output

11

数据范围及提示 Data Size & Hint

0<N<=500000,0<k<=50000

所有数据满足:-1000 ≤ Ai ≤ 1000,1 ≤ L ≤ R ≤ n且保证一定存在满足要求的乐曲。

/*
可持续性线段树+堆
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#define N 500010
#define M 10000010
using namespace std;
int a[N],co[N],root[N],used[N],n,m,l,r,cnt;
struct node
{
int sum,lc,rc;
};node t[M*];
priority_queue< pair<int,int> > q;
int read()
{
char c=getchar();int num=,flag=;
while(c<''||c>''){if(c=='-')flag=-;c=getchar();}
while(c>=''&&c<=''){num=num*+c-'';c=getchar();}
return num*flag;
}
int build(int v,int x,int y)
{
int k=++cnt;t[k].sum=v;
t[k].lc=x;t[k].rc=y;
return k;
}
void insert(int &root,int pre,int l,int r,int pos)
{
root=build(t[pre].sum+,t[pre].lc,t[pre].rc);
if(l==r)return;
int mid=(l+r)/;
if(pos<=mid)insert(t[root].lc,t[pre].lc,l,mid,pos);
else insert(t[root].rc,t[pre].rc,mid+,r,pos);
}
int query(int x,int y,int l,int r,int k)
{
if(l==r)return l;
int mid=(l+r)/;
int sum=t[t[y].lc].sum-t[t[x].lc].sum;
if(k<=sum)return query(t[x].lc,t[y].lc,l,mid,k);
else return query(t[x].rc,t[y].rc,mid+,r,k-sum);
}
int main()
{
n=read();m=read();l=read();r=read();
for(int i=;i<=n;i++)
{
int x=read();
a[i]=a[i-]+x;
co[i]=a[i];
}
sort(co+,co+n+);
int num=unique(co+,co+n+)-co-;
for(int i=;i<=n;i++)
{
int pos=lower_bound(co+,co+num+,a[i])-co;
insert(root[i],root[i-],,num,pos);
}
for(int i=;i+l-<=n;i++)
{
int L=i+l-,R=min(i+r-,n);
int len=(R-L+);++used[i];
int pos=query(root[L-],root[R],,num,len);
q.push(make_pair(co[pos]-a[i-],i));
}
long long ans=;
for(int i=;i<=m;i++)
{
int p=q.top().second;
ans+=q.top().first;q.pop();
int L=p+l-,R=min(p+r-,n);
int len=R-L+;used[p]++;
if(used[p]>=len+)continue;
int pos=query(root[L-],root[R],,num,len-used[p]+);
q.push(make_pair(co[pos]-a[p-],p));
}
cout<<ans;
return ;
}

超级钢琴(codevs 2934)的更多相关文章

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

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

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

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

  3. bzoj2006 noi2010 超级钢琴 主席树 + 优先队列

    Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2435  Solved: 1195 Description 小 Z是一个小有名气的钢琴家,最近C博士送 ...

  4. 2006: [NOI2010]超级钢琴 - BZOJ

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

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

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

  6. NOI2010超级钢琴 2

    2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 1296  Solved: 606[Submit][Status ...

  7. NOI2010超级钢琴

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

  8. 贪心(数据结构):COGS 468. [NOI2010]超级钢琴

    ★★★☆   输入文件:piano.in   输出文件:piano.out   简单对比 时间限制:2 s   内存限制:512 MB 超级钢琴 [问题描述] 小Z是一个小有名气的钢琴家,最近C博士送 ...

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

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

随机推荐

  1. [Swift通天遁地]一、超级工具-(9)在地图视图MKMapView中添加支持交互动作的标注图标

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  2. Ubuntu 16.04 安装OpenSSH7.4

      前几天突然收到接到网安总队下发通知说我们在aws里面的服务器存在重大漏洞及安全隐患.必须在规定时间内修改.我们收到邮件打开Excel发现这些问题 是由于OpenSSH版本太低导致的.于是便安排紧急 ...

  3. C++ 类中的3种权限作用范围

    三种访问权限 public:可以被任意实体访问 protected:只允许子类及本类的成员函数访问 private:只允许本类的成员函数访问 #include <iostream> #in ...

  4. linux学习之路3 文件系统结构

    一些有用的定义: linux文件系统为一个倒转的单根树状结构 文件系统的根为"/" linux系统文件严格区分大小写,而windows系统不区分大小写 路径使用"/&qu ...

  5. Java 8 (7) 重构、测试和调试

    为改善可读性和灵活性重构代码 看到这里我们已经可以使用lambda和stream API来使代码更简洁,用在新项目上.但大多数并不是全新的项目,而是对现有代码的重构,让它变的更简洁可读,更灵活. 改善 ...

  6. duilib属性

    原文转载自:http://blog.csdn.net/lixiang987654321/article/details/45008441 这里我想讲解一下duilib中的一些属性的理解,当然这是一篇永 ...

  7. Rxjava1升级Rxjava2踩坑一记

    Rxjava1升级Rxjava2坑 共存问题 通常情况下,如果我们希望在一个模块中既想使用rxjava1又想使用rxjava2,这个时候在运行的时候会出现一下报错: ... APK META/-INF ...

  8. 联想 P70-t 免解锁BL 免rec Magisk Xposed 救砖 ROOT

    >>>重点介绍<<< 第一:本刷机包可卡刷可线刷,刷机包比较大的原因是采用同时兼容卡刷和线刷的格式,所以比较大第二:[卡刷方法]卡刷不要解压刷机包,直接传入手机后用 ...

  9. UVM基础之---Command-line Processor

    提供一个厂商独立的通用接口命令行参数,支持分类:   1. 基本参数和值:get_args,get_args_matches   2. 工具信息:get_tool_name(),get_tool_ve ...

  10. Git——github高级

    分支管理 分支不是越多越好,只求一个稳定的分支,即master不要轻易去更改 对应master要有一个开发者分支,保证mater分支的稳定性 所有的功能都在开发者分支上进行 在所有功能开发后新建发布分 ...