P2048 [NOI2010]超级钢琴
考虑维护前缀和 $sum[i]$
那么对于每一个位置 $i$ ,左端点为 $i$ 右端点在 $[i+L-1,i+R-1]$ 区间的区间最大值容易维护
维护三元组 $(o,l,r)$ ,表示左端点为 $o$ ,右端点 $\in [l,r]$ 的区间最大值,然后把它扔到一个堆里,每次弹出最大值计算贡献
计算完后,设此三元组右端点为 $t$,还要记得把 $(o,l,t-1)$,和 $(o,t+1,r)$ 扔到堆里
具体看代码,不难理解
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int N=1e6+;
int n,K;
int sum[N],f[N][],Log[N];
namespace ST {//维护sum区间最大值的位置
void init()
{
for(int i=;i<=n;i++) f[i][]=i;
Log[]=-; for(int i=;i<=n;i++) Log[i]=Log[i>>]+;
for(int k=;(<<k)<=n;k++)
for(int i=;i+(<<k-)<=n;i++)
{
if(sum[f[i][k-]]>sum[ f[ i+(<<k-) ][k-] ]) f[i][k]=f[i][k-];
else f[i][k]=f[ i+(<<k-) ][k-];
}
}
inline int query(int l,int r)
{
int k=Log[r-l+];
if(sum[ f[l][k] ]>sum[ f[r-(<<k)+][k] ]) return f[l][k];
return f[r-(<<k)+][k];
}
}
struct dat {
int o,l,r,t;
dat (int o,int l,int r) : o(o),l(l),r(r),t(ST::query(l,r)) {}
inline bool operator < (const dat &tmp) const {
return sum[t]-sum[o-]<sum[tmp.t]-sum[tmp.o-];
}
};
priority_queue <dat> Q;
ll ans;
int main()
{
n=read(),K=read(); int l=read(),r=read(),a;
for(int i=;i<=n;i++) a=read(),sum[i]=sum[i-]+a;
ST::init();
for(int i=;i<=n;i++)
if(i+l-<=n) Q.push( dat(i,i+l-,min(n,i+r-)) );
while(K--)
{
dat T=Q.top(); Q.pop(); ans+=(sum[T.t]-sum[T.o-]);
if(T.l<T.t) Q.push(dat(T.o,T.l,T.t-));
if(T.r>T.t) Q.push(dat(T.o,T.t+,T.r));
}
printf("%lld",ans);
return ;
}
P2048 [NOI2010]超级钢琴的更多相关文章
- P2048 [NOI2010]超级钢琴(RMQ+堆+贪心)
P2048 [NOI2010]超级钢琴 区间和--->前缀和做差 多次查询区间和最大--->前缀和RMQ 每次取出最大的区间和--->堆 于是我们设个3元组$(o,l,r)$,表示左 ...
- 洛谷 P2048 [NOI2010]超级钢琴 解题报告
P2048 [NOI2010]超级钢琴 题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为 ...
- 【题解】P2048 [NOI2010]超级钢琴
[题解][P2048 NOI2010]超级钢琴 一道非常套路的题目.是堆的套路题. 考虑前缀和,我们要是确定了左端点,就只需要在右端区间查询最大的那个加进来就好了.\(sum_j-sum_{i-1} ...
- [洛谷P2048] [NOI2010] 超级钢琴
洛谷题目链接:[NOI2010]超级钢琴 题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号 ...
- LGOJ P2048 [NOI2010]超级钢琴
题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中A ...
- 洛谷 P2048 [NOI2010]超级钢琴 || Fantasy
https://www.luogu.org/problemnew/show/P2048 http://www.lydsy.com/JudgeOnline/problem.php?id=2006 首先计 ...
- 洛谷P2048 [NOI2010]超级钢琴 题解
2019/11/14 更新日志: 近期发现这篇题解有点烂,更新一下,删繁就简,详细重点.代码多加了注释.就酱紫啦! 正解步骤 我们需要先算美妙度的前缀和,并初始化RMQ. 循环 \(i\) 从 \(1 ...
- Luogu P2048 [NOI2010]超级钢琴
这道题题号很清新啊!第一次开NOI的题,因为最近考到了这道题的升级版. 我们先考虑\(O(n^2)\)大暴力,就是枚举前后端点然后开一个前缀和减一下即可. 然后引入正解,我们设一个三元组\(F(s,l ...
- P2048 [NOI2010]超级钢琴 (RMQ,堆)
大意: 给定n元素序列a, 定义一个区间的权值为区间内所有元素和, 求前k大的长度在[L,R]范围内的区间的权值和. 固定右端点, 转为查询左端点最小的前缀和, 可以用RMQ O(1)查询. 要求的是 ...
随机推荐
- Win10 Tensorflow 配置Mask_RCNN
1.安装Anaconda3 下载地址 Anaconda 官网下载地址:https://www.continuum.io/downloads 下载以后,点击exe程序,开始安装,详细的安装过程(图片参 ...
- c# 如何制作RealPlayer 视频播放器
c# 如何制作RealPlayer 视频播放器 主要介绍了如何使用 RealPlayer G2 Control 控件 那么我们怎么获得到这个控件呢,很简单,操作方法如下 右单击工具箱对话框的[所有 ...
- opennebula image单个实例响应数据格式
{ ", ", ", "TEMPLATE": { "DEV_PREFIX": "hd", " }, ...
- location.replace() keeps the history under control
from https://dev.opera.com/articles/efficient-javascript Occasionally, it is necessary to change the ...
- 探索Asp.net mvc 的文件上传(由浅入深)
代码下载:http://files.cnblogs.com/n-pei/mvcfileupload.zip 最近因为TeamVideo需要用到视频和图片上传功能,所以试着Google了很多资料,和大家 ...
- vs2012 许可 tfs 许可
Team Foundation Server 2012序列号或MSDN版本 BVGTF-T7MVR-TP46H-9Q97G-XBXRB VS2012注册码 亲测成功.我的是旗舰版... YKCW6-B ...
- SharePoint Server 2013 Excel Web Access无法显示
环境信息:SharePoint Server 2013 中文版,版本为15.0.4420.1017 Windows Server 2008 r2中文版 Sql Server 2012 问题描述:在Sh ...
- 【C#】特性标签中的属性解释
第一个为特性作用于类,或者接口(interface) 第二个为是否允许重叠定义,就是连续写两个特性标签 第三个为是否继承,当继承时候,除输出子类外,父类也将输出
- Jenkins 自动化部署asp.net
使用步骤 1.安装jenkins.git和vs,并确保机器上安装了.net framework 4.5和.net framework4.0 ,完成后访问http://localhost:8080. 2 ...
- 端口以及服务常用cmd
netstat -ano 列出所有端口的情况 netstat -aon|findstr "49157" 查出特定端口的情况 ...