[NOI2010]超级钢琴 倍增
[NOI2010]超级钢琴 倍增
暴力:枚举区间丢入堆\(O(n^2logn)\)
正解:考虑每次枚举和弦起点\(s\),那么以\(s\)为起点的和弦为\(sum[t]-sum[s](s+L-1\le t\le s+R-1)\),要使其最大则让\(sum[t]\)最大,问题转换为求区间\([l,r]\)最大\(sum[i]\),使用st表维护即可。
然后我们从堆中取\(k\)次,每次取出堆顶后,将剩下可取的区间重新丢回堆中。
#include <cstdio>
#include <queue>
#include <cmath>
#include <algorithm>
#define MAXN 500003
#define ll long long
int lg2[MAXN];
ll sum[MAXN];
int mx[MAXN][20]; // [i, i+2^j-1]
namespace rmq{
int query(int l, int r){
int t=lg2[r-l+1];
int a=mx[l][t],b=mx[r-(1<<t)+1][t];
if(sum[a]>sum[b]) return a;
else return b;
}
}
struct nod{
int s,l,r,ans;
nod(int s, int l, int r):s(s),l(l),r(r),ans(rmq::query(l, r)){}
bool operator < (const nod &a) const{
return sum[ans]-sum[s-1] < sum[a.ans]-sum[a.s-1];
}
};
int n,k,L,R;
std::priority_queue <nod> q;
int main(){
scanf("%d %d %d %d", &n, &k, &L, &R);
for(int i=1;i<=n;++i)
scanf("%lld", &sum[i]),sum[i]+=sum[i-1];
for(int i=2;i<=n;++i)
lg2[i]=lg2[i>>1]+1;
for(register int i=1;i<=n;++i) mx[i][0]=i;
for(register int j=1;j<=lg2[n];++j){
int len=(1<<j);
for(register int i=1;i+len-1<=n;++i){
int a=mx[i][j-1],b=mx[i+(1<<(j-1))][j-1];
if(sum[a]>sum[b]) mx[i][j]=a;
else mx[i][j]=b;
}
}
for(register int i=1;i+L-1<=n;++i)
q.push(nod(i, i+L-1, std::min(n, i+R-1)));
ll ans=0;
while(k--){
nod cur=q.top();
q.pop();
ans+=sum[cur.ans]-sum[cur.s-1];
if(cur.l<=cur.ans-1) q.push(nod(cur.s, cur.l, cur.ans-1));
if(cur.ans+1<=cur.r) q.push(nod(cur.s, cur.ans+1, cur.r));
}
printf("%lld", ans);
return 0;
}
[NOI2010]超级钢琴 倍增的更多相关文章
- 【bzoj2006】[NOI2010]超级钢琴 倍增RMQ+STL-堆
题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中A ...
- 【BZOJ 2006】2006: [NOI2010]超级钢琴(RMQ+优先队列)
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2792 Solved: 1388 Description 小 ...
- BZOJ2006 [NOI2010]超级钢琴 【堆 + RMQ】
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MB Submit: 3446 Solved: 1692 [Submit][Sta ...
- [ST表/贪心] NOI2010 超级钢琴
[NOI2010]超级钢琴 题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i ...
- BZOJ 2006: [NOI2010]超级钢琴
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2613 Solved: 1297[Submit][Statu ...
- Bzoj 2006: [NOI2010]超级钢琴 堆,ST表
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2222 Solved: 1082[Submit][Statu ...
- NOI2010超级钢琴 2
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 1296 Solved: 606[Submit][Status ...
- BZOJ 2006: [NOI2010]超级钢琴( RMQ + 堆 )
取最大的K个, 用堆和RMQ来加速... ----------------------------------------------------------------- #include<c ...
- BZOJ_2006_[NOI2010]超级钢琴_贪心+堆+ST表
BZOJ_2006_[NOI2010]超级钢琴_贪心+堆+ST表 Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的 音乐 ...
随机推荐
- Oracle部分
做了很多年Oracle,转行到MySQL了,算是借鉴 Oracle日常维护管理指标 一. 基本硬件环境 1. 主机硬件环境 品牌 型号 数量 物理CPU核数及逻辑CPU数 内存大小 本地硬盘大小 光驱 ...
- 《Java Web开发实战》——Java工程师必备干货教材
一年一度毕业季,又到了简历.offer漫天飞,失望与希望并存的时节.在IT行业,高校毕业生求职时,面临的第一道门槛就是技能与经验的考验,但学校往往更注重学生的理论知识,忽略了对学生实践能力的培养,因而 ...
- Sping Aop日志实现(六)--日志查询功能
最终效果: 日志查询流程分析: Controller代码: Mapper:
- hdu 6562 Lovers (线段树)
大意: 有$n$个数字串, 初始为空, 两种操作(1)把$[l,r]$范围的所有数字串首位添加数位$d$ (2)询问$[l,r]$区间和 假设添加的数为$L$, $L$位数为$H$, $L$翻转后乘上 ...
- vmware vSphere Data Protection 6.1--------2-初始化
一.简介 安装完vdp接下来就是部署初始化了 安装篇请参考:vmware vSphere Data Protection 6.1部署 二.开始初始化 登陆https://192.168.216.200 ...
- 【转载】为什么我的网站加www是打不开的呢
在访问网站的过程中,我们发现有些网站访问不带www的主域名可以正常访问,反而访问加www的域名打不开,那为什么有的网站加www是打不开的呢?此情况很大可能是因为没有解析带www的域名记录或者主机Web ...
- alt和title的区别
alt是html标签的属性,而title既是html标签,又是html属性. 在图像标签img中,除了常用的宽度width和高度height属性之外,还有两个比较重要并且也会用到的属性,就是alt和t ...
- active port
2510099 - SSL Port XXXXX Not Active - message on NWA even though SSL works Resolution Open the defau ...
- C实现哈希表
1 哈希表原理 这里不讲高深理论,只说直观感受.哈希表的目的就是为了根据数据的部分内容(关键字),直接计算出存放完整数据的内存地址. 试想一下,如果从链表中根据关键字查找一个元素,那么就需要遍历才能得 ...
- Linux CPU问题排查
某个进程的内存占用情况 查找进程pid——>进入该进程的目录/proc/{pid}/.有三个文件记录了进程内存 root@ROUTER:~# ps | grep zebra 1507 root ...