关于NOI2010“超级钢琴”的反思
[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 \sim 2\),美妙度为 \(3+2=5\);
- 音符 \(2 \sim 3\),美妙度为 \(2+(-6)=-4\);
- 音符 \(3 \sim 4\),美妙度为 \((-6)+8=2\);
- 音符 \(1 \sim 3\),美妙度为 \(3+2+(-6)=-1\);
- 音符 \(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“超级钢琴”的反思的更多相关文章
- 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 ...
- NOI2010超级钢琴 2
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 1296 Solved: 606[Submit][Status ...
- BZOJ 2006: [NOI2010]超级钢琴( RMQ + 堆 )
取最大的K个, 用堆和RMQ来加速... ----------------------------------------------------------------- #include<c ...
- BZOJ_2006_[NOI2010]超级钢琴_贪心+堆+ST表
BZOJ_2006_[NOI2010]超级钢琴_贪心+堆+ST表 Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的 音乐 ...
- bzoj2006 [NOI2010]超级钢琴 (及其拓展)
bzoj2006 [NOI2010]超级钢琴 给定一个序列,求长度在 \([L,\ R]\) 之间的区间和的前 \(k\) 大之和 \(n\leq5\times10^5,\ k\leq2\times1 ...
- P2048 [NOI2010]超级钢琴(RMQ+堆+贪心)
P2048 [NOI2010]超级钢琴 区间和--->前缀和做差 多次查询区间和最大--->前缀和RMQ 每次取出最大的区间和--->堆 于是我们设个3元组$(o,l,r)$,表示左 ...
- 洛谷 P2048 [NOI2010]超级钢琴 解题报告
P2048 [NOI2010]超级钢琴 题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为 ...
- bzoj千题计划162:bzoj2006: [NOI2010]超级钢琴
http://www.lydsy.com/JudgeOnline/problem.php?id=2006 输出最大的k个 sum[r]-sum[l-1] (L<=r-l+1<=R) 之和 ...
- 【BZOJ 2006】2006: [NOI2010]超级钢琴(RMQ+优先队列)
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2792 Solved: 1388 Description 小 ...
随机推荐
- Appweb+ESP学习笔记
Appweb+ESP学习笔记 1.Appweb简介 Appweb HTTP Web服务器是最快的小型Web服务器.这是一个高性能,紧凑的嵌入式网络服务器,具有模块化,安全的核心.它支持广 ...
- 深入理解 slab cache 内存分配全链路实现
本文源码部分基于内核 5.4 版本讨论 在经过上篇文章 <从内核源码看 slab 内存池的创建初始化流程> 的介绍之后,我们最终得到下面这幅 slab cache 的完整架构图: 本文笔者 ...
- 从原理到应用,人人都懂的ChatGPT指南
作者:京东科技 何雨航 引言 如何充分发挥ChatGPT潜能,已是众多企业关注的焦点.但是,这种变化对员工来说未必是好事情.IBM计划用AI替代7800个工作岗位,游戏公司使用MidJourney削减 ...
- #Python pandas库,读取模块,代码笔记
日常数据清洗中,利用python清洗的第一步就是读取对应文件,今天一起复盘一下数据读取环节的常规操作. csv和xlsx格式读取类似,所以用csv做案例 X-MIND图
- 2022-12-21:uifd/ui-for-docker是docker的web可视化工具。请问部署在k3s中,yaml文件如何写?
2022-12-21:uifd/ui-for-docker是docker的web可视化工具.请问部署在k3s中,yaml文件如何写? 答案2022-12-21: yaml如下: apiVersion: ...
- 【GiraKoo】面向对象开发系列之【封装】
[技术分享]面向对象开发系列之[封装] 理解 封装是面向对象程序开发的基石. 程序开发,最核心价值,是数据. 程序其实是读取数据,操作数据,保存数据等一系列操作. 那么经过良好组织过的数据,将使编程事 ...
- [学习笔记]解决因C#8.0的语言特性导致EFCore实体类型映射的错误
今天下午在排查一个EF问题时,遇到了个很隐蔽的坑,特此记录. 问题 使用ef执行Insert对象到某表时报错,此对象的Address为空: 不能将值 NULL 插入列 'Address',表 'dbo ...
- Vue 新建项目+基本语法
新建项目: 导入依赖: <script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"> ...
- There is not enough memory to perform the requested operation
今日在写bug 时 ide 突发脑溢血,崩溃了 一.修改用户目录下的 .vmoptions 找到C:\用户\用户名.WebStorm2018.1\config\webstorm64.exe.vmopt ...
- 代码随想录算法训练营Day18 二叉树| 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树
654.最大二叉树 题目链接:654.最大二叉树 给定一个不重复的整数数组 nums . 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值. 递归地 ...