bzoj2006: [NOI2010]超级钢琴(堆+RMQ)
和上一道题同类型...都是用堆求第k大
考虑对于每一个r,怎么求出一个最优的l。显然只需要求出前缀和,用RMQ查询前面最小的l的前缀和就好了。但是对于一个r,每个l只能选一次,选了一次之后,考虑怎么把l删掉。假设一个r,能选的l的区间在[A,B],那么选了l之后,这个区间就变成了[A,l-1]∪[l+1,B],所以我们可以构造一个四元组(sum, l, r, x)表示对于一个右端点x,能选择的左端点在[l,r],且最大的值为sum。用堆找出sum最大的二元组之后,求出这个sum的左端点y,然后把这个四元组拆成两个,能选择区间分别为[l,y-1]和[y+1,r],然后求出sum再加进堆里,取k次即得答案。
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<queue>
#include<cmath>
#define ll long long
using namespace std;
const int maxn=;
struct poi{int sum, l, r, x;};
priority_queue<poi>q;
int n, k, l, r;
int sum[maxn], f[maxn][];
ll ans;
void read(int &k)
{
int f=; k=; char c=getchar();
while(c<'' || c>'') c=='-' && (f=-), c=getchar();
while(c<='' && c>='') k=k*+c-'', c=getchar();
k*=f;
}
inline int min(int a, int b){return sum[a]<sum[b]?a:b;}
inline int querymin(int l, int r)
{
bool flag=; if(!l) l++, flag=;
if(l>r) return ;
int k=log2(r-l+), ans=min(f[l][k], f[r-(<<k)+][k]);
return flag?min(, ans):ans;
}
bool operator<(poi a, poi b) {return a.sum<b.sum;}
int main()
{
read(n); read(k); read(l); read(r);
for(int i=;i<=n;i++) read(sum[i]), sum[i]+=sum[i-], f[i][]=i;
for(int j=;j<=log2(n);j++)
for(int i=;i<=n-(<<j)+;i++)
f[i][j]=min(f[i][j-], f[i+(<<(j-))][j-]);
for(int i=l;i<=n;i++) q.push((poi){sum[f[i][]]-sum[querymin(max(, i-r), i-l)], max(, i-r), i-l, i});
for(int i=;i<=k;i++)
{
poi t=q.top(); q.pop();
ans+=t.sum; int x=querymin(t.l, t.r);
if(x!=t.l) q.push((poi){sum[f[t.x][]]-sum[querymin(t.l, x-)], t.l, x-, t.x});
if(x!=t.r) q.push((poi){sum[f[t.x][]]-sum[querymin(x+, t.r)], x+, t.r, t.x});
}
printf("%lld\n", ans);
return ;
}
为什么要求sum?这个不是可以O(1)算的吗?
一开始我写的就是用子程序算sum,把四元组变成三元组,要求sum的时候再临时调用子程序计算,导致的结果就是TLE!
虽然写了RMQ查询是O(1)的,但是多次调用子程序严重拖慢程序速度!宁愿多一维先计算出sum,这样调用子程序的次数会少很多,常数也就会小很多...


上方是先计算了sum的,下方是临时调用子程序计算sum的,可以发现常数大了一倍还多...而且我已经不是第一次因为多次调用子程序被卡常了T T
bzoj2006: [NOI2010]超级钢琴(堆+RMQ)的更多相关文章
- BZOJ2006[NOI2010]超级钢琴——堆+主席树
题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的 音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中 ...
- bzoj2006 [NOI2010]超级钢琴 (及其拓展)
bzoj2006 [NOI2010]超级钢琴 给定一个序列,求长度在 \([L,\ R]\) 之间的区间和的前 \(k\) 大之和 \(n\leq5\times10^5,\ k\leq2\times1 ...
- BZOJ2006 [NOI2010]超级钢琴 【堆 + RMQ】
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MB Submit: 3446 Solved: 1692 [Submit][Sta ...
- P2048 [NOI2010]超级钢琴(RMQ+堆+贪心)
P2048 [NOI2010]超级钢琴 区间和--->前缀和做差 多次查询区间和最大--->前缀和RMQ 每次取出最大的区间和--->堆 于是我们设个3元组$(o,l,r)$,表示左 ...
- [BZOJ2006][NOI2010]超级钢琴(ST表+堆)
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 3679 Solved: 1828[Submit][Statu ...
- bzoj千题计划162:bzoj2006: [NOI2010]超级钢琴
http://www.lydsy.com/JudgeOnline/problem.php?id=2006 输出最大的k个 sum[r]-sum[l-1] (L<=r-l+1<=R) 之和 ...
- 【BZOJ 2006】2006: [NOI2010]超级钢琴(RMQ+优先队列)
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2792 Solved: 1388 Description 小 ...
- Bzoj 2006: [NOI2010]超级钢琴 堆,ST表
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2222 Solved: 1082[Submit][Statu ...
- [BZOJ2006] [NOI2010]超级钢琴 主席树+贪心+优先队列
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 3591 Solved: 1780[Submit][Statu ...
- [NOI2010]超级钢琴(RMQ+堆)
小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中Ai可正可负 ...
随机推荐
- leetcode- 将有序数组转换为二叉搜索树(java)
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10,-3,0, ...
- [SHELL]查看端口,文件,服务关系的四个命令netstat,lsof,fuser,nmap
一,netstat (1)简介 netstat主要是用来打印系统网络的状态信息,当输入netstat后,输出如下: 可以看出,netstat的输出分为两个部分组成: 一个是Active Interne ...
- zabbix监控历史数据清理
2018/12/24 14:00:57 zabbix监控运行一段时间以后,会留下大量的历史监控数据,zabbix数据库一直在增大:可能会造成系统性能下降,查看历史数据室查询速度缓慢. zabbix里 ...
- 月薪45K的Python爬虫工程师告诉你爬虫应该怎么学,太详细了!
想用Python做爬虫,而你却还不会Python的话,那么这些入门基础知识必不可少.很多小伙伴,特别是在学校的学生,接触到爬虫之后就感觉这个好厉害的样子,我要学.但是却完全不知道从何开始,很迷茫,学的 ...
- Minimum Sum of Array(map迭代器)
You are given an array a consisting of n integers a1, ..., an. In one operation, you can choose 2 el ...
- OOP 1.4 内联函数和重载函数函数参数缺省值
1.内联函数 存在的背景:函数调用存在开销(调用时候参数压栈,返回地址压栈:返回时从栈取出返回地址,跳转到返回地址.总共需要几条指令的开销).如果函数指令较少,调用多次,函数调用的开销占比大. 内联函 ...
- OOP 1.3 动态内存分配
1.new运算符用法 分配一个变量:P=new T; T是任意类型名,P是类型为T的指针.动态分配出一片大小为sizeof(T)字节的内存空间,将该空间的起始地址赋值给P(new T的返回值为 T). ...
- 2014-2015 ACM-ICPC, NEERC, Eastern Subregional Contest Problem H. Pair: normal and paranormal
题目链接:http://codeforces.com/group/aUVPeyEnI2/contest/229669 时间限制:1s 空间限制:64MB 题目大意:给定一个长度为2n,由n个大写字母和 ...
- Js 中实现重定向的几种方式
之所以要总结这个,是因为在项目中使用了 AJAX,当请求成功时需要重定向到另一个页面. 1 . <script type="text/javascript"> wind ...
- 教你配置使用阿里云 Maven 库,体验秒下 jar 包的快感
鉴于国内的网络环境,从默认 Maven 库下载 jar 包是非常的痛苦. 速度慢就不说了,还经常是下不下来,然后一运行就是各种 ClassNotFoundException,然后你得找到残留文件删掉重 ...