贪心(数据结构):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 ...
- http学习笔记一
- discuz论坛几种安全策略(一)
安全问题 最近公司准备搭建一个discuz论坛,大头让我调研一下discuz的安全策略,并提出如下几点要求: 1.防止php上传漏洞2.防止大量刷新攻击限制某个IP大量刷新某一页面导致论坛宕机3.防止 ...
- SQL数据库安装
安装过程中经常出现失败或者提示,那么久要清楚干净所有的数据在重新安装,步骤如下. SQL2008卸载 一.从控制面板卸载 1)点击计算机右下角“开始”,点击“控制面板” 2)点击“卸载程序”. 卸载与 ...
- clientX 属性.
Syntax: event.clientX The clientX event attribute returns the horizontal coordinate (according to th ...
- 06MySQL数据库入门
1.数据库的概念 数据库是保存数据的仓库,可以方便的把数据放进去,并且把数据根据各种需求取出来. 数据库管理系统(Database Management System,DBMS)是对数据库进行管理(增 ...
- angular.js 数字
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script sr ...
- GridBagLayout的帮助类
自备详细注释 /* * To change this license header, choose License Headers in Project Properties. * To change ...
- laravel5通过auth.attempt事件加入登陆验证码
<?php namespace WangDong\Http\Controllers\Auth; use Illuminate\Http\Exception\HttpResponseExcepti ...
- SQL Server的事务处理与高级查询
6.高级查询与脚本 6.1子查询 位于SELECT查询中的SELECT查询. 6.11 标量表达式 select id,val,val-(select avg(val) from tbltest) f ...