超级钢琴(codevs 2934)
小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐。
这架超级钢琴可以弹奏出n个音符,编号为1至n。第i个音符的美妙度为Ai,其中Ai可正可负。
一个“超级和弦”由若干个编号连续的音符组成,包含的音符个数不少于L且不多于R。我们定义超级和弦的美妙度为其包含的所有音符的美妙度之和。两个超级和弦被认为是相同的,当且仅当这两个超级和弦所包含的音符集合是相同的。
小Z决定创作一首由k个超级和弦组成的乐曲,为了使得乐曲更加动听,小Z要求该乐曲由k个不同的超级和弦组成。我们定义一首乐曲的美妙度为其所包含的所有超级和弦的美妙度之和。小Z想知道他能够创作出来的乐曲美妙度最大值是多少。
输入文件第一行包含四个正整数n, k, L, R。其中n为音符的个数,k为乐曲所包含的超级和弦个数,L和R分别是超级和弦所包含音符个数的下限和上限。
接下来n行,每行包含一个整数Ai,表示按编号从小到大每个音符的美妙度。
输出文件只有一个整数,表示乐曲美妙度的最大值。
4 3 2 3
3
2
-6
8
11
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)的更多相关文章
- BZOJ 2006: [NOI2010]超级钢琴
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2613 Solved: 1297[Submit][Statu ...
- 【BZOJ-2006】超级钢琴 ST表 + 堆 (一类经典问题)
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2473 Solved: 1211[Submit][Statu ...
- bzoj2006 noi2010 超级钢琴 主席树 + 优先队列
Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2435 Solved: 1195 Description 小 Z是一个小有名气的钢琴家,最近C博士送 ...
- 2006: [NOI2010]超级钢琴 - BZOJ
Description小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为 ...
- Bzoj 2006: [NOI2010]超级钢琴 堆,ST表
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2222 Solved: 1082[Submit][Statu ...
- NOI2010超级钢琴 2
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 1296 Solved: 606[Submit][Status ...
- NOI2010超级钢琴
超级钢琴 [问题描述] 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度 ...
- 贪心(数据结构):COGS 468. [NOI2010]超级钢琴
★★★☆ 输入文件:piano.in 输出文件:piano.out 简单对比 时间限制:2 s 内存限制:512 MB 超级钢琴 [问题描述] 小Z是一个小有名气的钢琴家,最近C博士送 ...
- BZOJ 2006: [NOI2010]超级钢琴( RMQ + 堆 )
取最大的K个, 用堆和RMQ来加速... ----------------------------------------------------------------- #include<c ...
随机推荐
- datatable-bootstrap 基本配置
function doSearch() { if(dtable!=null){ dtable.fnClearTable(0); dtable.fnDraw(); // 重新加载数据 }else{ dt ...
- myBatis逆向生成及使用
引入数据库驱动 <!-- mybatis逆向生成包 --><dependency> <groupId>org.mybatis.generator</group ...
- redis+mysql读写方案
前言:在web服务端开发的过程中,redis+mysql是最常用的存储解决方案,mysql存储着所有的业务数据,根据业务规模会采用相应的分库分表.读写分离.主备容灾.数据库集群等手段.但是由于mysq ...
- ElasticSearch学习笔记--安装
1.安装ElasticSearch https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html 这 ...
- PHP7中session_start 使用注意事项,会导致浏览器刷时页面数据不更新
//PHP7中session_start 使用注意事项, session_start([ 'cache_limiter' => 'private', //在读取完毕会话数据之后马上关闭会话存储文 ...
- UML实例教程 解析UML建模分析与设计
UML统一建模语言在软件开发过程中非常实用,UMl建模的分析与设计你是否熟悉,这里就通过实例向大家介绍,希望通过本文的学习,你对UML建模的分析与设计方法有一定的了解. 本节向大家介绍一下图书管理系统 ...
- HDU_1143_tri tiling
Tri Tiling Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- JMeter怎样测试WebSocket,示例演示(二)
一.测试案例演示 以 http://www.websocket.org/echo.html 网站为例. 地址为:ws://echo.websocket.org 二.长连接的影响 1.没有勾选stre ...
- SpringBoot项目编译后没有xxxmapper.xml文件解决方法
在pom.xml文件中添加如下代码 <build> <plugins> <plugin> <groupId>org.springframework.bo ...
- 原来 JS 是这样的 - 关于 this
引子 习惯了别的语言的思维习惯而不专门了解 JavaScript 的语言特性的话,难免踩到一些坑. 上一篇文章 中简单总结了关于 提升, 严格模式, 作用域 和 闭包 的几个常见问题,当然这仅仅是了解 ...