【BZOJ】2006: [NOI2010]超级钢琴(前缀和+RMQ+堆)
题目
传送门:QWQ
分析
又不会做。。。。。。。
显然很好想到前缀和处理一下。
然后考虑最大化结果,直接上st表。
问题来了,然后呢?
怎么做$ length \in [l,r] $ 呢?
正解是设一个五元组 (i,l,r,val,pos) 。
i是左端点,l,r是右端点范围,val是 i 到 pos的和, pos是 右端点位置。
然后对于 l,r 二分,扔进优先队列处理 。取出前 k 大,累加一下就是答案。
完了。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=;
int n,posi[maxn][];
int sum[maxn],Log2[maxn];
struct Node{
int i,l,r,val,pos;
bool operator < (const Node& a) const{ return val<a.val;}
}; inline int Max(int x,int y) {return sum[x]>sum[y]? x:y;}
void ST(){
Log2[]=-;
for(int i=;i<=n;i++)
if((i&(i-))==) Log2[i]=Log2[i-]+; else Log2[i]=Log2[i-];
for(int i=;i<=n;i++) posi[i][]=i; for(int j=;(<<j)<=n;j++)
for(int i=;i+(<<j)<=n+;i++){
posi[i][j]=Max(posi[i][j-],posi[i+(<<(j-))][j-]);
}
}
inline int RMQ(int l,int r){
int tmp=Log2[r-l+];
return Max(posi[l][tmp],posi[r-(<<tmp)+][tmp]);
}
inline int read()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
priority_queue<Node> que;
int main()
{
int k,L,R;
scanf("%d%d%d%d",&n,&k,&L,&R);
for(int i=;i<=n;i++){
sum[i]=sum[i-]+read();
}
ST();
for(int i=;i<=n+-L;i++){
int pos=RMQ(i+L-,min(n,i+R-));
// printf("---------- %d %d %d\n",i+L-1,min(n,i+R-1),pos);
que.push((Node){i,i+L-,min(n,i+R-),sum[pos]-sum[i-],pos});
}
ll ans=;
while(k){
Node x=que.top();que.pop();
// printf("########## %d %d %d\n",x.i,x.pos,x.val);
k--; ans+=(ll)x.val;
Node ls=x,rs=x;
ls.r=x.pos-; rs.l=x.pos+;
if(ls.r>=ls.l) {
ls.pos=RMQ(ls.l,ls.r); ls.val=sum[ls.pos]-sum[ls.i-]; que.push(ls);
}
if(rs.r>=rs.l) {
rs.pos=RMQ(rs.l,rs.r); rs.val=sum[rs.pos]-sum[rs.i-]; que.push(rs);
}
}
// puts("-----------debug------------");
// for(int i=1;i<=n;i++) printf("%d ",Log2[i]);
printf("%lld\n",ans);
return ;
}
【BZOJ】2006: [NOI2010]超级钢琴(前缀和+RMQ+堆)的更多相关文章
- bzoj 2006: [NOI2010]超级钢琴【st表+堆】
设计一个五元组(i,l,r,p,v),表示在以i为左端点,右端点落在(l,r)中的情况下,取最大值v时右端点落在p.把这个五元组塞到优先队列里,以v排序,每次取出一个,然后把这个取过的五元组分成两个( ...
- BZOJ 2006: [NOI2010]超级钢琴( RMQ + 堆 )
取最大的K个, 用堆和RMQ来加速... ----------------------------------------------------------------- #include<c ...
- 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 ...
- 洛谷 P2048 BZOJ 2006 [NOI2010]超级钢琴
题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中A ...
- BZOJ 2006 [NOI2010]超级钢琴 (堆+主席树)
题面:BZOJ传送门 洛谷传送门 让你求前$K$大的子序列和,$n\leq 5*10^{5}$ 只想到了个$nlog^{2}n$的做法,似乎要被卡常就看题解了.. 好神奇的操作啊,我傻了 我们把序列和 ...
- BZOJ.2006.[NOI2010]超级钢琴(贪心 堆)
BZOJ 洛谷 思路和BZOJ3784一样,用前缀和+堆维护.做那题吧,不赘述啦. (没错我就是水一个AC) //54620kb 1060ms #include <queue> #incl ...
- BZOJ 2006 NOI2010 超级钢琴 划分树+堆
题目大意:给定一个序列.找到k个长度在[l,r]之间的序列.使得和最大 暴力O(n^2logn),肯定过不去 看到这题的第一眼我OTZ了一下午... 后来研究了非常久别人的题解才弄明确怎么回事...蒟 ...
- BZOJ 2006: [NOI2010]超级钢琴 [ST表+堆 | 主席树]
题意: 一个序列,求k个不相同的长度属于\([L,R]\)的区间使得和最大 前缀和,对于每个r找最小的a[l] 然后我yy了一个可持久化线段树做法...也许会T 实际上主席树就可以了,区间k小值 然后 ...
- bzoj 2006 [NOI2010]超级钢琴——ST表+堆
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2006 每个右端点的左端点在一个区间内:用堆记录端点位置.可选区间,按价值排序:拿出一个后也许 ...
随机推荐
- c# DataTable导出为excel
/// <summary> /// 将DataTable导出为Excel文件(.xls) /// </summary> /// <param name="dt& ...
- nginx Linux 开启自启
编辑 /etc/init.d/nginx 添加一下内容 根据路劲修改. 添加可执行权限 chmod +x /etc/init.d/nginx 开启自启 chkconfig nginx on ...
- Kotlin Reference (六) Control Flow
most from reference if表达式 在kotlin中,if是一个表达式,即它返回一个值.kotlin中没有Java中的三元运算符. // Traditional usage var m ...
- 求序列完美度(trie+贪心)
题目链接: 求序列完美度 题目描述 给出由n个数组成的序列s,规定第i个数s[i]到第j个数s[j]组成的子序列的完美度为该子序列中所有数的和与任意一个不在该子序列中的数进行异或运算得到的值中的最大值 ...
- 会议室预定demo mrbs
关于会议室的增删改查 查: HTML: login继承django自带的admin用户认证系统 <!DOCTYPE html> <html lang="en"&g ...
- storyboard出口回退问题
问题 直接在Main.storyboard拖动添加到出口的时候总是出一些不知名的错误.猜想可能是swift4又TM换了新特性(不过好喜欢啊哈哈哈哈) 解决 其实可以先拖动添加@IBAction函数到代 ...
- vue之element-ui设置全局弹出框
这样的需求,在主要功能完成后,需要进行交互效果的完善,需要给请求api的时候添加一个加载中的一个弹出框.但是每个页面每个页面过的话,会很费时间和精力,这里我们可以采用element-ui中的服务式弹出 ...
- 【javascript】利用jquery ajaxPrefilter防止ajax重复提交
利用jquery ajaxPrefilter中断请求 var pendingRequests = {}; $.ajaxPrefilter(function( options, originalOpti ...
- THREE.OrbitControls初始化设置位移/旋转/滚轮
let oldController;//已知的一个controller //初始化旋转(鼠标左键的操作) let position=oldController.object.position; cam ...
- 每天一个linux命令:【转载】cd命令
Linux cd 命令可以说是Linux中最基本的命令语句,其他的命令语句要进行操作,都是建立在使用 cd 命令上的. 所以,学习Linux 常用命令,首先就要学好 cd 命令的使用方法技巧. 1. ...