题目

传送门: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. 三张图看懂 clientheight、offsetheight、scrollheight

    clientheight clientheigh: 内容的可视区域,不包含border. clientheight=padding + height - 横向滚动轴高度. The Element.cl ...

  2. Springboot yml获取系统环境变量的值

    注意,这里说的是获取系统环境变量的值,譬如Windows里配置的JAVA_HOME之类的,可以直接在Springboot的配置文件中获取. 我们经常使用一些docker管理平台,如DaoCloud.r ...

  3. Swift显示alert和promp confirmation

    Swift 显示alert func Alert(title:String, msg:String)->Void{ let alert = UIAlertController(title: ti ...

  4. 实现Python代码发送邮件

    import smtplib from email.mime.text import MIMEText from email.utils import formataddr msg = MIMETex ...

  5. scrapy与scrapyd安装

    Scrapy是用python编写的爬虫程序. Scrapyd是一个部署与运行scrapy爬虫的应用,提供JSON API的调用方式来部署与控制爬虫 . 本文验证在fedora与centos是安装成功. ...

  6. 变色DNA(最短路思维题)

    个人心得:太水了,还是对最短路不太深入了解,无法构建出最短路模板,然后就是读题能力, 这题的关键在于转换为最短路模板,因为DFS我在24组超时了. 假设把从i到j的代价看做是权值,那么就是对权值的确立 ...

  7. 《DSP using MATLAB》示例Example 7.13

    代码: M = 25; alpha = (M-1)/2; n = [0:1:M-1]; hd = (2/pi) * ( (sin( (pi/2)*(n-alpha) ).^2)./(n-alpha) ...

  8. [UOJ310][UNR #2]黎明前的巧克力

    uoj description 给你\(n\)个数,求从中选出两个交集为空的非空集合异或和相等的方案数模\(998244353\). sol 其实也就是选出一个集合满足异或和为\(0\),然后把它分成 ...

  9. WPF实现Twitter按钮效果(转)

    最近上网看到这个CSS3实现的Twitter按钮,感觉很漂亮,于是想用WPF来实现下. 实现这个效果,参考了CSS3 原文地址:http://www.html5tricks.com/css3-twit ...

  10. Unite 2018 | 《崩坏3》:在Unity中实现高品质的卡通渲染(上)

    http://forum.china.unity3d.com/thread-32271-1-1.html 我们已经发布了Unite 2018 江毅冰的<发条乐师>.Hit-Point的&l ...