洛谷 P2048 [NOI2010]超级钢琴 解题报告
P2048 [NOI2010]超级钢琴
题目描述
小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐。
这架超级钢琴可以弹奏出n个音符,编号为1至n。第i个音符的美妙度为Ai,其中Ai可正可负。
一个“超级和弦”由若干个编号连续的音符组成,包含的音符个数不少于L且不多于R。我们定义超级和弦的美妙度为其包含的所有音符的美妙度之和。两个超级和弦被认为是相同的,当且仅当这两个超级和弦所包含的音符集合是相同的。
小Z决定创作一首由k个超级和弦组成的乐曲,为了使得乐曲更加动听,小Z要求该乐曲由k个不同的超级和弦组成。我们定义一首乐曲的美妙度为其所包含的所有超级和弦的美妙度之和。小Z想知道他能够创作出来的乐曲美妙度最大值是多少。
输入输出格式
输入格式:
输入第一行包含四个正整数n, k, L, R。其中n为音符的个数,k为乐曲所包含的超级和弦个数,L和R分别是超级和弦所包含音符个数的下限和上限。
接下来n行,每行包含一个整数Ai,表示按编号从小到大每个音符的美妙度。
输出格式:
输出只有一个整数,表示乐曲美妙度的最大值。
说明

所有数据满足:-1000 ≤ Ai ≤ 1000,1 ≤ L ≤ R ≤ n且保证一定存在满足要求的乐曲。
题意:求前\(k\)大长度在\(L\)~\(R\)之间的子序列之和
用堆维护\(ST\)表的做法没想到。。
想了个暴力\(nlog^2n\)的做法
枚举子序列左端点\(l\),则可能的右端点为一个长为\(R+1-L\)的序列,我们发现对于可能的右端点\(r\),产生的答案为\(f[r]-f[l-1]\),则每一个左端点固定后减去的值是一定的,只是产生的右端点划过去了。当然每个左端点可能产生多个子序列,我们不能只知道它的最大值。这时候,我们就可以想到拿主席树维护前缀和数组的静态区间第\(k\)值了,然后用一个堆维护每一个左端点所对应的区间取到第几大了。
然而我主席树一直写的不熟调了好久。。
Code:
#include <cstdio>
#include <queue>
#include <algorithm>
#include <iostream>
#define ll long long
using namespace std;
const ll N=2000010;
ll n,k,l0,r0;
ll d[N],score[N],root[N],dat[N<<4],L[N<<4],R[N<<4],num[N],cnt;
pair <ll ,ll > f[N];
ll build(ll l,ll r)
{
ll now=++cnt;
if(l==r) return now;
ll mid=l+r>>1;
L[now]=build(l,mid);
R[now]=build(mid+1,r);
return now;
}
ll rebuild(ll last,ll l,ll r,ll pos)
{
ll now=++cnt;
if(l==r)
{
dat[now]=1;
return now;
}
ll mid=l+r>>1;
if(pos<=mid)
{
L[now]=rebuild(L[last],l,mid,pos);
R[now]=R[last];
}
else
{
L[now]=L[last];
R[now]=rebuild(R[last],mid+1,r,pos);
}
dat[now]=dat[L[now]]+dat[R[now]];
return now;
}
ll query(ll last,ll now,ll l,ll r,ll num)
{
if(l==r) return l;
ll mid=l+r>>1;
if(dat[L[now]]-dat[L[last]]>=num)
return query(L[last],L[now],l,mid,num);
else
return query(R[last],R[now],mid+1,r,num-(dat[L[now]]-dat[L[last]]));
}
void init()
{
scanf("%lld%lld%lld%lld",&n,&k,&l0,&r0);
for(ll i=1;i<=n;i++)
{
scanf("%lld",&score[i]);
score[i]+=score[i-1];
f[i].second=i;
f[i].first=score[i];
}
sort(f+1,f+1+n);
for(ll i=1;i<=n;i++)
{
num[f[i].second]=n-i+1;
d[n-i+1]=f[i].first;
}
root[0]=build(1,n);
for(ll i=1;i<=n;i++)
root[i]=rebuild(root[i-1],1,n,num[i]);
}
priority_queue <pair <ll,ll > > q;
pair <ll,ll > p;
ll top[N];
void work()
{
for(ll i=l0;i<=n;i++)
{
ll r=min(i+r0-l0,n);
p.first=d[query(root[i-1],root[r],1,n,++top[i])]-score[i-l0];
p.second=i;
q.push(p);
}
ll ans=0;
while(k--)
{
ll now=q.top().second;
ans+=q.top().first;
q.pop();
if(top[now]>=min(r0-l0,n-now)+1) continue;
p.first=d[query(root[now-1],root[min(now+r0-l0,n)],1,n,++top[now])]-score[now-l0];
p.second=now;
q.push(p);
}
printf("%lld\n",ans);
}
int main()
{
init();
work();
return 0;
}
2018.7.5
洛谷 P2048 [NOI2010]超级钢琴 解题报告的更多相关文章
- [洛谷P2048] [NOI2010] 超级钢琴
洛谷题目链接:[NOI2010]超级钢琴 题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号 ...
- 洛谷P2048 [NOI2010]超级钢琴 题解
2019/11/14 更新日志: 近期发现这篇题解有点烂,更新一下,删繁就简,详细重点.代码多加了注释.就酱紫啦! 正解步骤 我们需要先算美妙度的前缀和,并初始化RMQ. 循环 \(i\) 从 \(1 ...
- 洛谷 P2048 [NOI2010]超级钢琴 || Fantasy
https://www.luogu.org/problemnew/show/P2048 http://www.lydsy.com/JudgeOnline/problem.php?id=2006 首先计 ...
- 洛谷 P2048 [NOI2010]超级钢琴(优先队列,RMQ)
传送门 我们定义$(p,l,r)=max\{sum[t]-sum[p-1],p+l-1\leq t\leq p+r-1 \}$ 那么因为对每一个$p$来说$sum[p-1]$是一个定值,所以我们只要在 ...
- 洛谷P0248 [NOI2010] 超级钢琴 [RMQ,贪心]
题目传送门 超级钢琴 题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符 ...
- 洛谷 P3990 [SHOI2013]超级跳马 解题报告
P3990 [SHOI2013]超级跳马 题目描述 现有一个\(n\) 行 \(m\) 列的棋盘,一只马欲从棋盘的左上角跳到右下角.每一步它向右跳奇数列,且跳到本行或相邻行.跳越期间,马不能离开棋盘. ...
- P2048 [NOI2010]超级钢琴(RMQ+堆+贪心)
P2048 [NOI2010]超级钢琴 区间和--->前缀和做差 多次查询区间和最大--->前缀和RMQ 每次取出最大的区间和--->堆 于是我们设个3元组$(o,l,r)$,表示左 ...
- 【题解】P2048 [NOI2010]超级钢琴
[题解][P2048 NOI2010]超级钢琴 一道非常套路的题目.是堆的套路题. 考虑前缀和,我们要是确定了左端点,就只需要在右端区间查询最大的那个加进来就好了.\(sum_j-sum_{i-1} ...
- 洛谷_Cx的故事_解题报告_第四题70
1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h> struct node { long x,y,c; ...
随机推荐
- navicat连接mysql出现1251错误
刚刚安装热乎的navicat发现出现1251错误,原因不大清楚,找到一个解决办法: 将mysql的密码重新重置一遍: 1.打开命令行 ,进入mysql所在的目录,输入 mysql -uroot -p ...
- python破解网吧收费系统,远控网吧电脑设备!
我今天呢 , 我就没事跟着朋友喝酒喝酒啊.喝了很多啊.晚上到旁边的酒店开了一个房间,到了酒店才十点! 感觉没啥事情干的,那就去网吧走走看把,看到是一个嘟嘟牛的,和上次是一样的.还是照常用MS170 ...
- 记一次RMI的调用数据失误
这两天在测试一个Spring RMI接口的时候,出现了个奇怪的问题.Server端返回的数据,到了客户端出现了属性丢失的情况. 类继承体系 .客户端里面定义在ClassA中的属性全部为null. 分析 ...
- RAID系列技术详解
1.RAID 0 RAID 0是把n个物理磁盘虚拟成一个逻辑磁盘,即形成RAID 0的各个物理磁盘会组成一个逻辑上连续,物理上也连续的虚拟磁盘.一级磁盘控制器(指使用这个虚拟磁盘的控制器,如果某台主机 ...
- 【Docker】第一篇 Docker的初始化安装部署
一.Docker基础 Dacker倡导的理念:一个容器一个进程 Docker的版本了解: Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE. 社区版是免费提供给个人 ...
- Linux安装软件包
今天在坐公交的路上看到一遍文章感觉还不错,先收集了.原文链接 Linux安装软件包
- 第一次作业——MathExam285
MathExam285 一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 • Estimate ...
- C#获取周一、周日的日期 函数类
#region 得到一周的周一和周日的日期 /// <summary> /// 计算本周的周一日期 /// </summary> ...
- 《Spring1之第九次站立会议》
<第九次站立会议> 昨天:对用C#写的视频功能进行了相关的了解. 今天:试着把用C#写的代码转换为java语言. 遇到的问题:说实话,真心不好转换,转换过程中遇到了很多问题.
- jsp九大内置对象之session和application
session和application 用的都是特别多尤其是application,但是想全面学习一下内置对象所以都了解一下. session又被称为是会话生存期是用户进入浏览器到关闭浏览器的期间.s ...