超级钢琴
2015-12-07 21:42
204 查看
超级钢琴
时间限制: 2 Sec 内存限制: 512 MB题目描述
小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐。
这架超级钢琴可以弹奏出n个音符,编号为1至n。第i个音符的美妙度为Ai,其中Ai可正可负。
一个“超级和弦”由若干个编号连续的音符组成,包含的音符个数不少于L且不多于R。我们定义超级和弦的美妙度为其包含的所有音符的美妙度之和。两个超级和弦被认为是相同的,当且仅当这两个超级和弦所包含的音符集合是相同的。
小Z决定创作一首由k个超级和弦组成的乐曲,为了使得乐曲更加动听,小Z要求该乐曲由k个不同的超级和弦组成。我们定义一首乐曲的美妙度为其所包含的所有超级和弦的美妙度之和。小Z想知道他能够创作出来的乐曲美妙度最大值是多少。
输入
输入文件名为piano.in。
输入文件第一行包含四个正整数n, k, L, R。其中n为音符的个数,k为乐曲所包含的超级和弦个数,L和R分别是超级和弦所包含音符个数的下限和上限。
接下来n行,每行包含一个整数Ai,表示按编号从小到大每个音符的美妙度。
输出
输出文件为piano.out。
输出文件只有一个整数,表示乐曲美妙度的最大值。
样例输入
4 3 2 3
3
2
-6
8
样例输出
11
题解
主席树+堆代码
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<cmath> #include<queue> #include<algorithm> #define ll long long using namespace std; int n,N,k,l,r,cnt,pos[500010]; ll ans,f[500010],c[500010]; struct node{int lc,rc,sum;}t[15000010]; struct wbs{ int a;ll b; wbs(int a=0,int b=0):a(a),b(b){} bool operator<(const wbs &x)const{return b<x.b;} }; priority_queue<wbs>q; class seg_tree { ll qry(int x,int pre,int l,int r,int p) { if(l==r)return c[l]; int mid=l+r>>1,num=t[t[x].lc].sum-t[t[pre].lc].sum; if(p<=num)qry(t[x].lc,t[pre].lc,l,mid,p); else qry(t[x].rc,t[pre].rc,mid+1,r,p-num); } void build(int x,int pre,int l,int r,int p) { t[x]=t[pre];t[x].sum++; if(l==r)return; int mid=l+r>>1; if(p<=mid)build(t[x].lc=++cnt,t[pre].lc,l,mid,p); else build(t[x].rc=++cnt,t[pre].rc,mid+1,r,p); } public: ll query(int x,int pre,int p) { return qry(x,pre,0,N,p); } void make(int x) { build(x,x-1,0,N,f[x]); } }T; int main() { int tk; scanf("%d%d%d%d",&n,&k,&l,&r); for(int i=2;i<=n+1;i++) scanf("%d",&tk),f[i]=f[i-1]+tk,c[i]=f[i]; sort(c+1,c+n+2); N=unique(c+1,c+n+2)-c-1;cnt=n+1; for(int i=1;i<=n+1;i++) f[i]=lower_bound(c+1,c+N+1,f[i])-c; for(int i=1;i<=n+1;i++)T.make(i); for(int i=l+1;i<=n+1;i++) q.push(wbs(i,c[f[i]]-T.query(i-l,max(i-r-1,0),pos[i]=1))); for(int i=1;i<=k;i++) { wbs p=q.top();q.pop(); int x=p.a;ans+=p.b; if(pos[x]==min(r-l+1,x-l))continue; q.push(wbs(x,c[f[x]]-T.query(x-l,max(x-r-1,0),++pos[x]))); } printf("%lld\n",ans); return 0; }
相关文章推荐
- HDU-3555-Bomb【数位dp】
- IDEA部署Spark1.5.2开发环境--Spark学习(基础)
- Git详解之二:Git基础[转]
- Sharepoint 2013默认dll部署位置
- FJNU OJ 1053
- crossDomain、allowDomain()、allowScriptAccess三者的关系
- 计算句子相似度
- CSU 1548-Design road(三分)
- 黑马程序员—java基础复习—基础知识
- 轻松学习JavaScript十二:JavaScript基于面向对象之创建对象(一)
- IOS之简单代理
- java排序算法
- Android Log等级的介绍
- SQLite 学习
- 通过图和文字说明来辨别mysql和Oracle数据库
- 多播
- 【计算机网络】:可靠数据传输的原理
- Scala 抽象类
- 序列终结者
- java 程序性能优化《第二章》设计优化 2.1善用设计模式 1 单例模式