贪心(数据结构):COGS 468. [NOI2010]超级钢琴
★★★☆ 输入文件: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 ~ 2,美妙度为3 + 2 = 5
- 音符2 ~ 3,美妙度为2 + (-6) = -4
- 音符3 ~ 4,美妙度为(-6) + 8 = 2
- 音符1 ~ 3,美妙度为3 + 2 + (-6) = -1
- 音符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]超级钢琴的更多相关文章
- 【贪心 计数】bzoj2006: [NOI2010]超级钢琴
这么经典的贪心我怎么现在才做啊…… Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的 音乐. 这架超级钢琴可以弹奏出n个 ...
- BZOJ_2006_[NOI2010]超级钢琴_贪心+堆+ST表
BZOJ_2006_[NOI2010]超级钢琴_贪心+堆+ST表 Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的 音乐 ...
- [ST表/贪心] NOI2010 超级钢琴
[NOI2010]超级钢琴 题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i ...
- P2048 [NOI2010]超级钢琴(RMQ+堆+贪心)
P2048 [NOI2010]超级钢琴 区间和--->前缀和做差 多次查询区间和最大--->前缀和RMQ 每次取出最大的区间和--->堆 于是我们设个3元组$(o,l,r)$,表示左 ...
- [BZOJ2006] [NOI2010]超级钢琴 主席树+贪心+优先队列
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 3591 Solved: 1780[Submit][Statu ...
- bzoj2006 [NOI2010]超级钢琴 (及其拓展)
bzoj2006 [NOI2010]超级钢琴 给定一个序列,求长度在 \([L,\ R]\) 之间的区间和的前 \(k\) 大之和 \(n\leq5\times10^5,\ k\leq2\times1 ...
- [BZOJ2006][NOI2010]超级钢琴(ST表+堆)
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 3679 Solved: 1828[Submit][Statu ...
- BZOJ 2006: [NOI2010]超级钢琴
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2613 Solved: 1297[Submit][Statu ...
- Bzoj 2006: [NOI2010]超级钢琴 堆,ST表
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2222 Solved: 1082[Submit][Statu ...
随机推荐
- css 实现页面加载中等待效果
<!DOCTYPE html> <html> <head> <title>css实现页面加载中,请稍候效果</title> <meta ...
- 从ActionFilterAttribute向view传送数据
[原文转载]http://www.cnblogs.com/QLeelulu/archive/2008/08/17/1269599.html 原文地址:ASP.NET MVC Tip #31 – Pas ...
- PDF在线预览
1.所需插件jquery.media.js或者pdfobject.js 代码: <html> <head> <style type="text/css" ...
- 一个初学者对CLSA.NET框架的使用心得
什么是CSLA.NET框架? 今天在一个群里,有人问我什么是CSLA.NET,CSLA是Component-based, Scalable, Logical Architecture的简写,CSLA ...
- xml有哪些解析技术?区别是什么?
xml有哪些解析技术?区别是什么? Answer: 有DOM,SAX,STAX等 (1):DOM:处理大型文件时其性能下降的非常厉害.这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且D ...
- winform降低功耗总结
这里整理了一些网上关于Winform如何降低系统内存占用的资料,供参考: 1.使用性能测试工具dotTrace 3.0,它能够计算出你程序中那些代码占用内存较多2.强制垃圾回收3.多dispose,c ...
- JS自执行函数的几种写法
一:整体写在一个括号中 代码如下: (function Show(){alert("hello");}()) 二:function函数整体外加括号 代码如下: (function ...
- wdcp对default站点开启apache url重写功能
网站开启对default网站的重写功能
- linux c静态链接库与动态链接库
库函数是我们编程的时候经常用到的,我们协作编程的时候可以将常用的函数封装成库供大家使用,这样能够提高大家的工作效率.对于库函数,它分为动态链接库和静态链接库.对于静态链接库我们必须是连接到可执行文件中 ...
- 在Ubuntu12.0.4下搭建TFTP服务器
一.安装相关安装包 tftpd(服务端),tftp(客户端) sudo apt-get install tftp-hpa tftpd-hpa 安装xinetd sudo apt-get install ...