题目

传送门: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+堆)的更多相关文章

  1. bzoj 2006: [NOI2010]超级钢琴【st表+堆】

    设计一个五元组(i,l,r,p,v),表示在以i为左端点,右端点落在(l,r)中的情况下,取最大值v时右端点落在p.把这个五元组塞到优先队列里,以v排序,每次取出一个,然后把这个取过的五元组分成两个( ...

  2. BZOJ 2006: [NOI2010]超级钢琴( RMQ + 堆 )

    取最大的K个, 用堆和RMQ来加速... ----------------------------------------------------------------- #include<c ...

  3. BZOJ 2006: [NOI2010]超级钢琴

    2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2613  Solved: 1297[Submit][Statu ...

  4. Bzoj 2006: [NOI2010]超级钢琴 堆,ST表

    2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2222  Solved: 1082[Submit][Statu ...

  5. 洛谷 P2048 BZOJ 2006 [NOI2010]超级钢琴

    题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中A ...

  6. BZOJ 2006 [NOI2010]超级钢琴 (堆+主席树)

    题面:BZOJ传送门 洛谷传送门 让你求前$K$大的子序列和,$n\leq 5*10^{5}$ 只想到了个$nlog^{2}n$的做法,似乎要被卡常就看题解了.. 好神奇的操作啊,我傻了 我们把序列和 ...

  7. BZOJ.2006.[NOI2010]超级钢琴(贪心 堆)

    BZOJ 洛谷 思路和BZOJ3784一样,用前缀和+堆维护.做那题吧,不赘述啦. (没错我就是水一个AC) //54620kb 1060ms #include <queue> #incl ...

  8. BZOJ 2006 NOI2010 超级钢琴 划分树+堆

    题目大意:给定一个序列.找到k个长度在[l,r]之间的序列.使得和最大 暴力O(n^2logn),肯定过不去 看到这题的第一眼我OTZ了一下午... 后来研究了非常久别人的题解才弄明确怎么回事...蒟 ...

  9. BZOJ 2006: [NOI2010]超级钢琴 [ST表+堆 | 主席树]

    题意: 一个序列,求k个不相同的长度属于\([L,R]\)的区间使得和最大 前缀和,对于每个r找最小的a[l] 然后我yy了一个可持久化线段树做法...也许会T 实际上主席树就可以了,区间k小值 然后 ...

  10. bzoj 2006 [NOI2010]超级钢琴——ST表+堆

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2006 每个右端点的左端点在一个区间内:用堆记录端点位置.可选区间,按价值排序:拿出一个后也许 ...

随机推荐

  1. c# 实体处理工具类

    using System; using System.Collections; using System.Collections.Generic; using System.ComponentMode ...

  2. dpkg: 处理归档 /var/cache/apt/archives/swig2.0_2.0.12-1ubuntu4_amd64.deb (--unpack)时出错:

    问题: sudo apt-get upgrade 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 正在计算更新... 完成下列软件包的版本将保持不变: lib ...

  3. (转)Hive自定义UDAF详解

    UDAF有两种,第一种是比较简单的形式,利用抽象类UDAF和UDAFEvaluator,暂不做讨论.主要说一下第二种形式,利用接口GenericUDAFResolver2(或者抽象类AbstractG ...

  4. 看完前任三,想起我的前任java女程序员,她曾教会我……

    前任三最近非常火了,票房蹭蹭往上升,昨天也去电影院看了,想起了我的前任,她是一名女程序员,为了让我学好java,她曾经亲自教我Java的算法,学算法是件非常重要的事,在这忍住回忆的悲伤,分享给你们. ...

  5. 5.查找最小的k个元素[Kmin]

    [题目] 输入n个整数,输出其中最小的k个. 例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4. [分析] 这道题最简单的思路莫过于把输入的n个整数排序,这样排在最前 ...

  6. 【剑指offer】数组中的逆序对。C++实现

    原创文章,转载请注明出处! 博客文章索引地址 博客文章中代码的github地址 # 题目 # 思路 基于归并排序的思想统计逆序对:先把数组分割成子数组,再子数组合并的过程中统计逆序对的数目.统计逆序对 ...

  7. kubeadm搭建kubernetes集群之二:创建master节点

    在上一章kubeadm搭建kubernetes集群之一:构建标准化镜像中我们用VMware安装了一个CentOS7虚拟机,并且打算用这个虚拟机的镜像文件作为后续整个kubernetes的标准化镜像,现 ...

  8. docker下的Jenkins安装和体验【转】

    原文地址:http://blog.csdn.net/boling_cavalry/article/details/78942408 作为一款优秀的持续集成工具,jenkins在日常的项目中经常会用到, ...

  9. Python IDE in Sublime

    (最近换了电脑,然后忘了把 ST 的配置搬过来,所以重新折腾了一遍 Sublime 中的 Python 环境配置) 以下插件均通过 Package Control 安装. SublimeREPL 快捷 ...

  10. Luogu3387 缩点 【tarjan】【DP】

    Luogu3387 缩点 题目背景 缩点+DP 题目描述 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点, ...