★★★☆   输入文件: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. Android 四大组件之service与Broadcast

    Android 四大组件之一:service: Service有五个生命周期:onCreat,onStartCommand, onBind,onUnbind, onDestroy 主要有绑定和非绑定两 ...

  2. 在xcode6.1和ios10.10.1环境下实现app发布

    之前写过在xcode6.1和ios10.10.1环境下实现真机测试,以及最近提交的app一直在审核当中,所以木有发布如何实现app发布来分享给大家.刚好昨天app审核通过了,所以就分享一篇如何实现ap ...

  3. iOS中常用的正则表达式

    iOS常用正则表达式 正则表达式用于字符串处理.表单验证等场合,实用高效.现将一些常用的表达式收集于此,以备不时之需. 匹配中文字符的正则表达式: [\u4e00-\u9fa5]评注:匹配中文还真是个 ...

  4. js判断是否在iframe中

    1.方式一 if (self.frameElement && self.frameElement.tagName == "IFRAME") { alert('在if ...

  5. c++异常机制实现原理

    今天突然看到一篇文章,讲异常机制的实现,所以分享一下:http://baiy.cn/doc/cpp/inside_exception.htm 内容讲的很深,但是编译器的实现是不是真是这样就不知道了,我 ...

  6. cocos2dx 实现华丽丽的滚动层.

    前言 好久没写博客了. 前几周策划要求实现一个比较多功能的滚动层控件. 这个艰巨的任务就这样自然而然的落在了我这小身板上. 当然了, 只要我出手, 难度再高的需求也变得不堪一击. 哈哈哈哈 示例图 该 ...

  7. SGU 156. Strange Graph(欧拉路)

    时间限制:0.25s 空间限制:6M 题目描述 让我们想象一个无向图G=<V,E>.如果边(u,v)在边集E中,那么我们就说两个顶点u和v是邻接点.在这种情况下,我们也说u是v的一个邻接点 ...

  8. nuc970连接jlink进行单步调试的设置

    在 USB mode 下, 先跟 NuWriter 接上, 然后用以下的设定. 按 Keil 的 debug (不是 download to flash)就可以接上了.

  9. CentOS 6.5 IP 设置

    DEVICE=eth0TYPE=EthernetUUID=7d6d54e0-054d-472b-8cc1-080f16ef36c1ONBOOT=yesNM_CONTROLLED=yesBOOTPROT ...

  10. ios开发之通知事件

    每天学习一点点,总结一点点,成功从良好的习惯开始! 昨天学习了ios开发中的关于通知事件的一些东西,在这里简单总结下,仅供初学者学习,更多的是怕我自己忘了,咩哈哈~~~~ 通知(notificatio ...