题目

传送门: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. Django项目的ORM操作之--数据模型类创建

    在django项目中,其自带了ORM(Object Relation Mapping)对象关系映射框架,我们在django项目下app的models模块下对类进行操作,通过ORM会将我们对类的操作转化 ...

  2. windows下类似Linux下的grep命令

    今天要查看windws下代理服务器有哪些IP连接过来,但使用 netstat -na 后出现很多连接会话,不方便查看. 想到Linux下的grep非常方便,于是网络上搜寻,还是有类似的命令findst ...

  3. 用servlet来提取数据,并作统计,然后用jfreechart画图

    指定时间范围的数据提取,并做统计: 用servlet来提取数据,并作统计,然后用jfreechart画图. 使用的话,需要在web.xml里面配置相应的servlet,并且在index.jsp页面做引 ...

  4. SQL映射文件

     SQL映射文件的几个顶级元素 mapper - namespace cache - 配置给定命名空间的缓存 cache-ref – 从其他命名空间引用缓存配置 resultMap –用来描述数据库结 ...

  5. 转:java c/s tomcat 三层架构

    概述在c/s结构的发展历程中,产生了两层c/s结构和三层c/s结构之分.在两层c/s结构中,在信息管理系统的管理上主要分为客户端和数据库服务器. 缺点有两个: 1)开销高昂.在两层c/s结构中,为了维 ...

  6. C++开发人脸性别识别教程(6)——通过SVM实现性别识别

    http://blog.csdn.net/u013088062/article/details/50480518

  7. 将window上的项目上传到自己的github

    使用git 1.首先在自己的github上面新建仓库 2.记下远程仓库的地址 3.在要上传的项目的目录下使用git命令进行上传 (1)先git init 初始化本地的仓库 (2)git add -A ...

  8. Golang的简明安装指南

    引言: Go language现在是大名鼎鼎,很多的开源项目都是基于go来做的,比如codis, ethereum等都用到了go lang,所以免不了要使用这个东东,本文将简明介绍安装步骤以及环境变量 ...

  9. Java调用本地方法又是怎么一回事

    JNI JNI即Java Native Interface,它能在Java层实现对本地方法的调用,一般本地的实现语言主要是C/C++,其实从虚拟机层面来看JNI挺好理解,JVM主要使用C/C++ 和少 ...

  10. 【Java实战】源码解析Java SPI(Service Provider Interface )机制原理

    一.背景知识 在阅读开源框架源码时,发现许多框架都支持SPI(Service Provider Interface ),前面有篇文章JDBC对Driver的加载时应用了SPI,参考[Hibernate ...