[NOI2010] 超级钢琴

题目描述

小 Z 是一个小有名气的钢琴家,最近 C 博士送给了小 Z 一架超级钢琴,小 Z 希望能够用这架钢琴创作出世界上最美妙的音乐。

这架超级钢琴可以弹奏出 \(n\) 个音符,编号为 \(1\) 至 \(n\)。第 \(i\) 个音符的美妙度为 \(A_i\),其中 \(A_i\) 可正可负。

一个“超级和弦”由若干个编号连续的音符组成,包含的音符个数不少于 \(L\) 且不多于 \(R\)。我们定义超级和弦的美妙度为其包含的所有音符的美妙度之和。两个超级和弦被认为是相同的,当且仅当这两个超级和弦所包含的音符集合是相同的。

小 Z 决定创作一首由 \(k\) 个超级和弦组成的乐曲,为了使得乐曲更加动听,小 Z 要求该乐曲由 \(k\) 个不同的超级和弦组成。我们定义一首乐曲的美妙度为其所包含的所有超级和弦的美妙度之和。小 Z 想知道他能够创作出来的乐曲美妙度最大值是多少。

输入格式

输入第一行包含四个正整数 \(n, k, L, R\)。其中 \(n\) 为音符的个数,\(k\) 为乐曲所包含的超级和弦个数,\(L\) 和 \(R\) 分别是超级和弦所包含音符个数的下限和上限。

接下来 \(n\) 行,每行包含一个整数 \(A_i\),表示按编号从小到大每个音符的美妙度。

输出格式

输出只有一个整数,表示乐曲美妙度的最大值。

样例 #1

样例输入 #1

4 3 2 3
3
2
-6
8

样例输出 #1

11

提示

样例解释

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

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

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

所有数据满足:\(-1000 \leq A_i \leq 1000\),\(1 \leq L \leq R \leq n\) 且保证一定存在满足要求的乐曲。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int s[500010];
struct liu
{
int l,r,las,id;
friend bool operator <(liu a,liu b)
{
return s[a.las]-s[a.id-1]<s[b.las]-s[b.id-1];
}
}a;
priority_queue <liu>q;
int n;
int f[1000010][25];
void init()
{
for(int i=1;i<=n;i++)
{
f[i][0]=i;
}
for(int i=1;(1<<i)<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(s[f[j][i-1]]>s[f[j+(1<<(i-1))][i-1]])
f[j][i]=f[j][i-1];
else
f[j][i]=f[j+(1<<(i-1))][i-1];
}
}
}
int st(int l,int r)
{
int k=log2(r-l+1);
if(s[f[l][k]]>s[f[r-(1<<k)+1][k]])
return f[l][k];
else
return f[r-(1<<k)+1][k];
}
int main()
{
int k,l,r;
scanf("%d%d%d%d",&n,&k,&l,&r);
for(int i=1;i<=n;i++)
{
scanf("%d",&s[i]);
s[i]+=s[i-1];
}
init();
for(int i=1;i<=n;i++)
{
a.id=i;
int ll=i+l-1,rr=min(n,i+r-1);
if(rr>=ll)
{
int fd=st(ll,rr);
a.las=fd;
a.l=ll;
a.r=rr;
q.push(a);
}
}
long long ans=0;
for(int i=1;i<=k;i++)
{
a=q.top();
q.pop();
ans+=(long long)(s[a.las]-s[a.id-1]);
int ll=a.l,rr=a.r,aa=a.las;
if(aa+1<=rr)
{
int fd=st(aa+1,rr);
a.las=fd;
a.l=aa+1;
a.r=rr;
q.push(a);
}
if(aa-1>=ll)
{
int fd=st(ll,aa-1);
a.las=fd;
a.l=ll;
a.r=aa-1;
q.push(a);
}
}
printf("%lld",ans);
return 0;
}

1.应用前缀和,可以把最值和和的最值结合起来

2.优先队列其实没有那么慢

3.要敢写深想

4.st表还可以和前缀和结合起来

5.一点点的失误可能会MLE

关于NOI2010“超级钢琴”的反思的更多相关文章

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

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

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

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

  3. NOI2010超级钢琴 2

    2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 1296  Solved: 606[Submit][Status ...

  4. BZOJ 2006: [NOI2010]超级钢琴( RMQ + 堆 )

    取最大的K个, 用堆和RMQ来加速... ----------------------------------------------------------------- #include<c ...

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

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

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

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

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

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

  8. 洛谷 P2048 [NOI2010]超级钢琴 解题报告

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

  9. bzoj千题计划162:bzoj2006: [NOI2010]超级钢琴

    http://www.lydsy.com/JudgeOnline/problem.php?id=2006 输出最大的k个 sum[r]-sum[l-1] (L<=r-l+1<=R) 之和 ...

  10. 【BZOJ 2006】2006: [NOI2010]超级钢琴(RMQ+优先队列)

    2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2792  Solved: 1388 Description 小 ...

随机推荐

  1. This application failed to start because it could not find or load the Qt platforms plugins

     由于一直在linux下操作,今天Qt移植平台的时候导致.exe可执行文件一直运行不起来,提示缺少某些dll库,这个问题解决起来简单(直接去qt源码里面查找对应库添加到可执行文件目录就行),但是之后一 ...

  2. js 获取窗口/容器内部滚动位置

    前端 (document.getElementsByClassName("container")[0]).scrollTop -- 容器内部滚动条位置 (document.getE ...

  3. pg数据库的备份和恢复以及sql脚本错误的解决方法

    1.备份单库单表的数据,以insert语句的方式 pg_dump -h IP -p 端口 -U 用户名 -t 表名 --inserts –f dbname.sql 数据库名 pg_dump -h 17 ...

  4. 2022-10-04:以下go语言代码输出什么?A:{123} main.T{x:123} B:{123} T{x:123} C:boo boo D:boo main.T{x:123}。 packag

    2022-10-04:以下go语言代码输出什么?A:{123} main.T{x:123} B:{123} T{x:123} C:boo boo D:boo main.T{x:123}. packag ...

  5. 2021-06-19:交错字符串。 有三个字符串s1,s2,s3。判断s3是否由s1和s2交错组成的。比如s1=“abc“,s2=“123“,s3=“12ab3c“,应该返回true,因为s3去掉12

    2021-06-19:交错字符串. 有三个字符串s1,s2,s3.判断s3是否由s1和s2交错组成的.比如s1="abc",s2="123",s3=" ...

  6. IBM小型机 - 登录Web控制台

    前言: IBM 小型机没有VGA或者HDMI接口,只能通过web或者串口的方式,配置和查看设备的硬件信息: 我们可以通过两种方式获取小型机的IP,并通过浏览器访问. 操作步骤: 1.服务器接通电源,直 ...

  7. phalApi非常好用的php-api框架

    偶然的一天,在开源中国,找到了phalApi,看到了介绍,我一下子被吸引了,这正是我一直要找的后端生成json的API框架,有了这个造数据的系统,我前端做得更得心应手了,渐渐我有了全栈开发的想法!

  8. Spring源码:Bean生命周期(终章)

    前言 本系列前面讲解了Spring的bean定义.bean实例化.bean初始化等生命周期.这些步骤使我们能够了解bean从创建到准备好使用所经历的过程.但是,除了这些步骤,bean的销毁也是非常重要 ...

  9. Isito 入门:为什么学 Istio、Istio 是什么

    1,Istio 概述 聊聊微服务设计 似乎用上 Kubernetes ,就是微服务系统了. 碰到很多人或公司盲目崇拜 Kubernetes ,一直喊着要上 Kubernetes,但是本身既没有技术储备 ...

  10. ChatGPT在线体验原理课-概览:ChatGPT 与自然语言处理

    # 概览:ChatGPT 与自然语言处理 本文将介绍 ChatGPT 与自然语言处理的相关知识. ## ChatGPT 与图灵测试 图灵测试是人工智能领域的一个经典问题,它旨在检验计算机是否能够表现出 ...