★★★☆   输入文件:piano.in   输出文件:piano.out   简单对比
时间限制:2 s  
内存限制: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

【样例说明】

共有5种不同的超级和弦:

  1. 音符1 ~ 2,美妙度为3 + 2 = 5
  2. 音符2 ~ 3,美妙度为2 + (-6) = -4
  3. 音符3 ~ 4,美妙度为(-6) + 8 = 2
  4. 音符1 ~ 3,美妙度为3 + 2 + (-6) = -1
  5. 音符2 ~ 4,美妙度为2 + (-6) + 8 = 4

最优方案为:乐曲由和弦1,和弦3,和弦5组成,美妙度为5 + 2 + 4 = 11。

【数据规模和约定】

总共10个测试点,数据范围满足:

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

  

  这题考虑贪心,用一个三元组记录node为起点,能取到的右端点区间。

  用ST可以O(1)求出区间中应取哪一个右端点,每次取最大的,处理成两个子区间,放回heap中,继续贪心。

 #include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn=;
int n,K,L,R,s[maxn],pos;
struct Node{
int node,l,r;
Node(int NODE=,int L=,int R=){
node=NODE;l=L;r=R;
}
};
int mm[maxn],Max[maxn][],Mpos[maxn][]; int Query(int l,int r){
if(Max[l][mm[r-l+]]<Max[r-(<<mm[r-l+])+][mm[r-l+]]){
pos=Mpos[r-(<<mm[r-l+])+][mm[r-l+]];
return Max[r-(<<mm[r-l+])+][mm[r-l+]];
}
else{
pos=Mpos[l][mm[r-l+]];
return Max[l][mm[r-l+]];
}
} int Q(Node x){
return Query(x.l,x.r)-s[x.node-];
} struct Heap{
int cnt;
Node h[maxn<<];
void Insert(Node x){
int p=++cnt;
while(p!=){
if(Q(x)<=Q(h[p>>]))break;
h[p]=h[p>>];
p>>=;
}
h[p]=x;
} void Delete(){
int p=,a,b;
Node x=h[cnt--];
while(p*<=cnt){
a=p<<;b=a|;
if(b<=cnt&&Q(h[a])<Q(h[b]))a=b;
if(Q(h[a])<=Q(x))break;
h[p]=h[a];
p=a;
}
h[p]=x;
}
}q; int main(){
freopen("piano.in","r",stdin);
freopen("piano.out","w",stdout);
scanf("%d%d%d%d",&n,&K,&L,&R); for(int i=;i<=n;i++)
scanf("%d",&s[i]);
for(int i=;i<=n;i++)
s[i]+=s[i-]; mm[]=-;
for(int i=;i<=n;i++){
mm[i]=(i&(i-))==?mm[i-]+:mm[i-];
Max[i][]=s[i];
Mpos[i][]=i;
} for(int k=;k<=mm[n];k++)
for(int i=;i+(<<k)-<=n;i++){
if(Max[i][k-]>Max[i+(<<(k-))][k-]){
Max[i][k]=Max[i][k-];
Mpos[i][k]=Mpos[i][k-];
}
else{
Max[i][k]=Max[i+(<<(k-))][k-];
Mpos[i][k]=Mpos[i+(<<(k-))][k-];
}
} for(int i=;i<=n-L+;i++)
q.Insert(Node(i,i+L-,min(i+R-,n))); long long ans=;
int p;
Node x;
while(K--){
ans+=Q(q.h[]);
x=q.h[];p=pos;
q.Delete(); if(x.l<p)q.Insert(Node(x.node,x.l,p-));
if(x.r>p)q.Insert(Node(x.node,p+,x.r));
}
printf("%lld\n",ans);
return ;
}

贪心(数据结构):COGS 468. [NOI2010]超级钢琴的更多相关文章

  1. 【贪心 计数】bzoj2006: [NOI2010]超级钢琴

    这么经典的贪心我怎么现在才做啊…… Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的 音乐. 这架超级钢琴可以弹奏出n个 ...

  2. BZOJ_2006_[NOI2010]超级钢琴_贪心+堆+ST表

    BZOJ_2006_[NOI2010]超级钢琴_贪心+堆+ST表 Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的 音乐 ...

  3. [ST表/贪心] NOI2010 超级钢琴

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

  4. P2048 [NOI2010]超级钢琴(RMQ+堆+贪心)

    P2048 [NOI2010]超级钢琴 区间和--->前缀和做差 多次查询区间和最大--->前缀和RMQ 每次取出最大的区间和--->堆 于是我们设个3元组$(o,l,r)$,表示左 ...

  5. [BZOJ2006] [NOI2010]超级钢琴 主席树+贪心+优先队列

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

  6. bzoj2006 [NOI2010]超级钢琴 (及其拓展)

    bzoj2006 [NOI2010]超级钢琴 给定一个序列,求长度在 \([L,\ R]\) 之间的区间和的前 \(k\) 大之和 \(n\leq5\times10^5,\ k\leq2\times1 ...

  7. [BZOJ2006][NOI2010]超级钢琴(ST表+堆)

    2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 3679  Solved: 1828[Submit][Statu ...

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

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

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

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

随机推荐

  1. NSString NSCFString区别

    NSString 是 NSCFString的父类 在于NSString是个class cluster,一个类簇.什么是一个类簇?简单的来说,NSString是个“工厂类”,然后它在外层提供了很多方法接 ...

  2. 华硕_ZX50JX4200 安装ssd固态盘

    本人亲身的一次经历,帮朋友的华硕手提装一个内存和ssd固态 内存5分钟搞定,但是ssd固态盘就经过了一番的折腾 首先要拧掉所有后盖的螺丝,把光驱拆下来,注意撬开键盘板的时候有排线,不能弄断了.然后一定 ...

  3. 不使用ASP.NET服务器端控件(包括form表单不加runat="server")来触发.cs里的事件(方法),(适用于有代码洁癖者)。

    很多时候,我们使用服务器端控件写出的代码,会给我们生成一些很多我们看不懂的代码(初学者),但是有时候我们并不需要这些代码(业务需求不同),对于生成的一些代码感到多余.所以我就开始想,有没有一种可能:不 ...

  4. Linux的压缩解压命令快速上手——解压篇

    在Linux系统中,压缩文件通常是先将若干文件(包括目录)打包成一个tar文件,然后再调用压缩程序将tar文件压缩成相应的压缩包,这也就是为什么Linux系的压缩包的后缀通常都是像tar.gz,tar ...

  5. yzoi2223集合构造的详细解法

    Description - 问题描述 集合M的定义如下: 1是M中的元素 如果x是M中的元素,那么2x+1和4x+5都是M中的元素 那么,集合M中,最小的n个数是哪些? Input - 输入数据 一个 ...

  6. 下拉框——把一个select框中选中内容移到另一个select框中遇到的问题

    在使用jQuery实现把一个select框中选中内容移到另一个select框中功能时遇到了一个问题,就是点击按钮时内容可以到另一个select框中,但是到了另一个select框中的内容却很快闪退回原来 ...

  7. 验证视图状态MAC失败解决方案

    验证视图状态 mac 失败.如果此应用程序由网络场或群集承载 请确保 machinekey 配置指定了相同的 validationkey 和验证算法.不能在群集中使用 autogenerate. 总是 ...

  8. VLC命令参数(转载)

    转载自: http://blog.csdn.net/bytxl/article/details/6613449 http://www.cnblogs.com/MikeZhang/archive/201 ...

  9. iOS适配:Masonry介绍与使用实践:快速上手Autolayout

    随着iPhone的手机版本越来越多, 那么对于我们广大的开发者来说就是很悲催,之前一直使用代码里面layout的约束来适配, 现在推荐一个第三方Masonry,上手块,操作简单,只能一个字形容他 “爽 ...

  10. JS 导出图片,toDataURL

    //输出图片 function exportCanvasAsPNG(id, fileName) { //获取canvas元素 var canvasElement = document.getEleme ...