题目描述 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. centos docker 安装mysql 8.0

    centos 版本  CentOS Linux release 7.5.1804 (Core) 内核版本: 3.10.0-862.el7.x86_64 下载最新版mysql docker pull m ...

  2. JS 九宫格算法 用原生js实现

    九宫格算法核心: 利用控件索引index计算出控件所在的行数和列数: 利用控件计算出left距离: 利用控件计算出top距离: 写特效时需要用到定位 公式: 行 row=parseInt(i/cols ...

  3. Java多线程(五)停止线程 在沉睡中停止线程

    在沉睡中停止线程会抛出异常 public class SleepInterruptDemo extends Thread { public void run() { super.run(); try ...

  4. php 报错如下:Notice: Trying to get property of non-object

    参考文档如下解决: https://stackoverflow.com/questions/5891911/trying-to-get-property-of-non-object-in 问题如下: ...

  5. sql剪切数据

    实际项目当中用到的案例,个人笔记. USE [CA-SM]GO/****** Object:  StoredProcedure [dbo].[PG_SM_AddSum]    Script Date: ...

  6. JavaScript(十二)事件

    Dom事件 1.DOM0级事件 on事件 只能 监听冒泡阶段 切只能绑定一个事件 dom.onclick = function(){}; 2.Dom2级事件 可以绑定多次事件    可以通过设置fla ...

  7. Android 仿淘宝头条竖直跑马灯式新闻标题及“分页思想

    在淘宝App的首页中间位置,有一块小小的地方在不知疲倦地循坏滚动着头条标题(见下图的红框区域),这样的设计无疑能够在有限的手机屏幕上展示更丰富的内容.而实现这一功能需要用到的控件就是我在上一篇文章中提 ...

  8. ubantu MongoDB安装

    转 https://blog.csdn.net/flyfish111222/article/details/51886787 本博文介绍了MongoDB,并详细指引读者在Ubuntu下MongoDB的 ...

  9. jdbc分页查询

    虽然现在db层的框架很多,用起来也非常的方便,像分页这种非常常用的功能也基本上都有对应的接口可以直接使用.但是有时候数据源不在配置的范围的时候,就必须要使用到jdbc来执行sql,jdbc执行的是原生 ...

  10. (转) 淘淘商城系列——使用SolrJ查询索引库

    http://blog.csdn.net/yerenyuan_pku/article/details/72908538 我们有必要在工程中写查询索引库的代码前先进行必要的测试.我们先到Solr服务页面 ...