超级钢琴(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 ...
随机推荐
- 17 C#中的循环执行 while循环
在编程中有代码的执行主要有三种方式.(1)顺序执行,也就是一条语句一条语句按顺序执行:(2)条件执行,也就是if...else.当某种条件满足时执行一些代码:(3)循环执行,就是当某种条件满足的时候, ...
- java用匿名内部类实现多线程堆内存变量共享
匿名内部类介绍:http://www.cnblogs.com/nerxious/archive/2013/01/25/2876489.html 用Runnable模拟实现共享堆内存变量 import ...
- [ Nowcoder Contest 167 #C ] 部分和
\(\\\) \(Description\) 给出一个长度为\(N\)的数组\(A[i]\),保证\(N\)为 \(2\) 的整次幂. 对于每个 \(i\ (i\in [0,N))\)求所有满足\(( ...
- Elasticsearch--更好的搜索_加权得分,脚本,同义词
目录 Apache Lucene评分 Elasticsearch的脚本功能 脚本执行过程中可以使用的对象 使用自定义的脚本库 搜索不同语言的内容 使用加权影响得分 加权 function_score查 ...
- 微信小程序组件解读和分析:二、scroll-view可滚动视图区域
scroll-view可滚动视图区域组件说明: 可滚动视图区域. 组件用法:纵向滚动用法 Tip: 使用竖向滚动时,需要给一个固定高度,通过 WXSS 设置 height,否则无法滚动. 当滚动到顶部 ...
- Angular——MVC模式开发实战
创建项目 创建工作目录 使用bower下载需要插件 git init.add.commit之后得到分支master,再创建developer分支,然后再此分支上进行具体功能开发 MVC架构 之前小项目 ...
- 通过Maven将指定Jar包下载到指定的本地目录
现在大家大部分都通过Maven等工具来管理包,但是特殊情况下还是需要将包下载到本地.我们可以通过maven命令来完成这个需求.创建一个pom.xml文件,文件内容如下: <?xml versio ...
- ios 布局 素材 待整理
https://www.cnblogs.com/fxwl/p/5961372.html div区域 8.盒子模型的相关属性 margin(外边距/边界) border(边框) padding(内边距/ ...
- First Project -用函数写的ATM+购物商城程序
作业需求:模拟实现一个ATM + 购物商城程序 额度15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 每月22号出账单,每月10号为还款日,过期未还,按欠 ...
- DeepCloneObjects 和 DeepClone
ARX AcDbDatabase 中的方法 deepCloneObjects() 和 wblock() 区别以及和 AcDbObject 方法 clone() 和 deepClone() 的关系 Ac ...