【题解 P2048】 超级钢琴
[NOI2010] 超级钢琴
题目描述
小 Z 是一个小有名气的钢琴家,最近 C 博士送给了小 Z 一架超级钢琴,小 Z 希望能够用这架钢琴创作出世界上最美妙的音乐。
这架超级钢琴可以弹奏出
一个“超级和弦”由若干个编号连续的音符组成,包含的音符个数不少于
小 Z 决定创作一首由
输入格式
输入第一行包含四个正整数
接下来
输出格式
输出只有一个整数,表示乐曲美妙度的最大值。
样例 #1
样例输入 #1
4 3 2 3
3
2
-6
8
样例输出 #1
11
提示
样例解释
共有
- 音符
,美妙度为 ; - 音符
,美妙度为 ; - 音符
,美妙度为 ; - 音符
,美妙度为 ; - 音符
,美妙度为 。
最优方案为:乐曲由和弦
所有数据满足:
解题思路
题意简述就是要我们选出
由于有区间和,我们就可以用前缀和。
对于一个左端点为
由于有长度限制,我们可以固定住左端点为
由于
那我们就可以开一个
每次取出来后,把它分裂为两部分,即分裂成
每次累加答案,即可求最大值。
Code
#include<bits/stdc++.h>
using namespace std;
struct datay
{
int x,y,z;
datay(int q,int w,int e)
{
x=q;
y=w;
z=e;
}
};
long long n,a[500005],l[500005],p[500005],L,R,k,s;
int f[500005][21],z;
int gaia(int ll,int rr)
{
z=l[rr-ll+1];
return (a[f[ll][z]]>a[f[rr-p[z]+1][z]])?f[ll][z]:f[rr-p[z]+1][z];
}
bool operator <(const datay &q,const datay &w)
{
return (a[gaia(q.y,q.z)]-a[q.x])<(a[gaia(w.y,w.z)])-a[w.x];
}
priority_queue<datay> t;
int main()
{
datay q=datay(0,0,0);
int x;
scanf("%lld%lld%lld%lld",&n,&k,&L,&R);
for(int i=1;i<=n;i++)scanf("%lld",&a[i]),f[i][0]=i,a[i]+=a[i-1];
l[0]=-1,p[0]=1;
for(int i=1;i<=n;i++)l[i]=l[i/2]+1;
for(int i=1;i<=20;i++)p[i]=p[i-1]*2;
for(int i=1;i<=20;i++)
{
for(int j=1;j+p[i]-1<=n;j++)
{
if(a[f[j][i-1]]>a[f[j+p[i-1]][i-1]])f[j][i]=f[j][i-1];
else f[j][i]=f[j+p[i-1]][i-1];
}
}
for(int i=1;i<=n-L+1;i++)
{
t.push(datay(i-1,i+L-1,min(n,i+R-1)));
}
for(int i=1;i<=k;i++)
{
q=t.top();
x=gaia(q.y,q.z);
s+=(a[x]-a[q.x]);
t.pop();
if(x!=q.y)t.push(datay(q.x,q.y,x-1));
if(x!=q.z)t.push(datay(q.x,x+1,q.z));
}
cout<<s;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!