题目

传送门: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. Hibernate常见配置详细解释

      <!--标准的XML文件的起始行,version='1.0'表明XML的版本,encoding='gb2312'表明XML文件的编码方式--> <?xml version='1. ...

  2. python常用模块之json、pickle模块

    python常用模块之json.pickle模块 什么是序列化? 序列化就是把内存里的数据类型转换成字符,以便其能存储到硬盘或者通过网络进行传输,因为硬盘或网络传输时只接受bytes. 为什么要序列化 ...

  3. java 多线程超详细总结——阿里大牛熬夜整理

    引 如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个 ...

  4. java未来发展方向!新手入门了解

    随社会信息的发展着,java广泛应用于PC.数据中心.游戏控制台.科学超级计算机.移动电话和互联网等行业.从目前的招聘量上看,对java开发人才需求量是很大的,而且未来的仍然是主流,就业前景很好.只要 ...

  5. 网络编程 socket编程 - Asyncsocke

    简单的聊天程序:http://blog.csdn.net/chang6520/article/details/7967662 iPhone的标准推荐是CFNetwork 库编程,其封装好的开源库是 c ...

  6. BZOJ3594: [Scoi2014]方伯伯的玉米田【二维树状数组优化DP】

    Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感 ...

  7. 关于swagger文档的使用方法

    引言 最近在后台开发的时候,使用swagger2进行前后台接口文档的声明.由此遇见的一些问题,写下来给自己复习. 参考: https://blog.csdn.net/xupeng874395012/a ...

  8. 《selenium2 python 自动化测试实战》(17)——几个cookies操作

    之前我们已经学过利用cookies跳过验证码登录了,那时候我们用的方法是add_cookie()方法,这里再给大家介绍两个,一般情况下我们用不到,了解一下就可以,而且如果真的用到的时候百度也很快的: ...

  9. LeetCode 760. Find Anagram Mappings

    原题链接在这里:https://leetcode.com/problems/find-anagram-mappings/description/ 题目: Given two lists Aand B, ...

  10. 关于rs编码的理解

    1,rs编码首先是线性循环编码,所谓线性循环编码就是说编码后的码组T(x)左移或右移都必然还是有限组码组中的一组,并且T(X)码组能够被g(x)整除,g(x)为生成多项式. 2,由信息码m(x)得到T ...