【题意】给定长度为n的整数序列,求长度为[L,R]的前k大区间和的和。n,k<=500000。

【算法】堆+贪心+RMQ

【题解】考虑暴力是取所有长度为[L,R]的子串的前k大求和,复杂度O(n^2)。

发现左端点相同的区间[l,r]中,最大的区间和就是最大的sum[r](sum是前缀和数组)。

然后将所以左端点放进堆中,每次取出堆顶之后把第二大的r扔进去,重复k次。

现在的问题是取区间最大的r,第二大的r……区间第k大?用主席树维护即可,复杂度O(n log n)。

还可以用ST表(RMQ)维护,定义三元组(x,l,r)表示取左端点为x,右端点为[l,r]的区间最大sum[r]。

假设对于(x,l,r),取出元素y,就在堆中加入两个三元组(x,l,y-1)和(x,y+1,r)。

复杂度O(n log n)。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=;
int n,k,L,R,d[maxn][],sum[maxn],p[maxn][],logs[maxn];
struct cyc{
int x,l,r,y;
bool operator < (const cyc &a) const
{return sum[y]-sum[x-]<sum[a.y]-sum[a.x-];}
}qp;
priority_queue<cyc>q;
void RMQ_init()
{
logs[]=-;for(int i=;i<=n;i++)logs[i]=logs[i>>]+;
for(int i=;i<=n;i++){d[i][]=sum[i];p[i][]=i;}
for(int j=;(<<j)<=n;j++)
for(int i=;i+(<<j)-<=n;i++)
{
d[i][j]=max(d[i][j-],d[i+(<<(j-))][j-]);
p[i][j]=d[i][j-]>d[i+(<<(j-))][j-]?p[i][j-]:p[i+(<<(j-))][j-];
}
}
int RMQ(int l,int r)
{
int K=logs[r-l+];
return d[l][K]>d[r-(<<K)+][K]?p[l][K]:p[r-(<<K)+][K];
}
int main()
{
scanf("%d%d%d%d",&n,&k,&L,&R);
sum[]=;
for(int i=;i<=n;i++){scanf("%d",&sum[i]);sum[i]+=sum[i-];}
RMQ_init();
for(int i=;i<=n;i++){
if(i+L-<=n)q.push((cyc){i,i+L-,min(n,i+R-),RMQ(i+L-,min(n,i+R-))});
}
long long ans=;
for(int i=;i<=k;i++)
{
qp=q.top();q.pop();
ans+=sum[qp.y]-sum[qp.x-];
if(qp.y>qp.l)q.push((cyc){qp.x,qp.l,qp.y-,RMQ(qp.l,qp.y-)});
if(qp.y<qp.r)q.push((cyc){qp.x,qp.y+,qp.r,RMQ(qp.y+,qp.r)});
}
printf("%lld",ans);
return ;
}

【BZOJ】2006: [NOI2010]超级钢琴的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  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表+堆】

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

随机推荐

  1. HBase 架构与工作原理4 - 压缩、分裂与故障恢复

    本文系转载,如有侵权,请联系我:likui0913@gmail.com Compacation HBase 在读写的过程中,难免会产生无效的数据以及过小的文件,比如:MemStore 在未达到指定大小 ...

  2. [知乎]老狼:深入PCI与PCIe之二:软件篇

    深入PCI与PCIe之二:软件篇 https://zhuanlan.zhihu.com/p/26244141 我们前一篇文章(深入PCI与PCIe之一:硬件篇 - 知乎专栏)介绍了PCI和PCIe的硬 ...

  3. 固态盘经常性蓝屏处理方法(WIN7/8)

    型号:intel 520S 大小;120G 我的是笔记本,这段时间辞职,有了时间折腾自己的电脑系统了,想装WIN8来着,PE下直接把固态盘的分区都干掉了,分了C,D(40G,剩下的空间),安装阶段完美 ...

  4. [转帖]InfiniBand 主流厂商 和 产品分析

    InfiniBand 主流厂商 和 产品分析   Mellanox成立于1999年,总部设在美国加州和以色列,Mellanox公司是服务器和存储端到端连接InfiniBand解决方案的领先供应商.20 ...

  5. [学习]Windows server 使用控制台时容易卡死的解决方法

    公司使用Windows server 下面的 cmd 命令行 控制台打开某一个 bat 文件的方式 进行后台使用.. 但是经常发现在winserver 2016 时 遇到卡死的情况, 今天中午我再进行 ...

  6. [转帖]“剖开” LinuxONE 和 Exadata,架构专家解读里面到底有什么

    “剖开” LinuxONE 和 Exadata,架构专家解读里面到底有什么 http://server.zhiding.cn/server/2018/0914/3111044.shtml    说起I ...

  7. sublinme 快捷键格式

    {"keys": ["ctrl+shift+f"], "command": "reindent" , "arg ...

  8. Mac 安装nodejs

    原文链接:http://blog.csdn.net/u010053344/article/details/50545304 Mac 安装nodejs 这几日因为需求需要又临时用到nodejs,之前安装 ...

  9. 【uoj#37/bzoj3812】[清华集训2014]主旋律 状压dp+容斥原理

    题目描述 求一张有向图的强连通生成子图的数目对 $10^9+7$ 取模的结果. 题解 状压dp+容斥原理 设 $f[i]$ 表示点集 $i$ 强连通生成子图的数目,容易想到使用总方案数 $2^{sum ...

  10. 80X86计算机组织

    计算机主要由运算器.控制器.存储器.和输入输出设备构成. 主频: 主频是指芯片所用的主时钟频率,它直接影响计算机的运行速度,由于处理器体系结构的差别,同样的主频可能产生不同的计算速度,但主频仍然是反映 ...