[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]超级钢琴 倍增的更多相关文章

  1. 【bzoj2006】[NOI2010]超级钢琴 倍增RMQ+STL-堆

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

  2. 【BZOJ 2006】2006: [NOI2010]超级钢琴(RMQ+优先队列)

    2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2792  Solved: 1388 Description 小 ...

  3. BZOJ2006 [NOI2010]超级钢琴 【堆 + RMQ】

    2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 552 MB Submit: 3446  Solved: 1692 [Submit][Sta ...

  4. [ST表/贪心] NOI2010 超级钢琴

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

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

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

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

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

  7. NOI2010超级钢琴 2

    2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 1296  Solved: 606[Submit][Status ...

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

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

  9. BZOJ_2006_[NOI2010]超级钢琴_贪心+堆+ST表

    BZOJ_2006_[NOI2010]超级钢琴_贪心+堆+ST表 Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的 音乐 ...

随机推荐

  1. 『Python基础练习题』day05

    # 请将列表中的每个元素通过 "_" 链接起来. users = ['毛利兰', '柯南', '怪盗基德'] # 请将元组 v1 = (11, 22, 33) 中的所有元素追加到列 ...

  2. Lambda 表达式动态拼接.

    背景: 项目使用EF 查询时需要手动判断条件写.觉得太麻烦就Google 如何动态生成Linq.最后找到了 System.Linq.Dynamic.Core. 这个东西. Scott Guthrie ...

  3. springboot启动流程(目录)

    springboot出现有段时间了,不过却一直没有怎么去更多地了解它.一方面是工作的原因,另一方面是原来觉得是否有这个必要,但要持续做java似乎最终逃不开要去了解它的命运.于是考虑花一段时间去学习一 ...

  4. axios配置及使用(发起请求时带上token)

    1.安装 利用npm安装 npm install axios --save 2.引入即可使用 import axios from 'axios' 3.目录 4.各个文件设置: (1)env.js ex ...

  5. UI5-技术篇-SAP UI5数据表进行了比较:sap.m.Table与sap.ui.table.Table

    https://a.kabachnik.info/sap.m.table-vs-sap.ui.table.table-features-compared.html SAP UI5数据表进行了比较:sa ...

  6. mysql limit和offset用法

    limit和offset用法 mysql里分页一般用limit来实现 1. select* from article LIMIT 1,3 2.select * from article LIMIT 3 ...

  7. PE重装系统

    PE重装系统 PE: 含义:全称 Windows Preinstall Environment,即Windows 预安装环境 作用: 是一个用于Windows安装准备的最小操作系统,其实就是一个简易版 ...

  8. 【Zookeeper】本地ZK的搭建

    很久没有写了..最近看书的笔记都记在有道云上面..框架的使用觉得还是有必要写一下 1.下载 官网:https://www.apache.org/dyn/closer.cgi 清华镜像:https:// ...

  9. 织梦dede:channelartlist调用排除指定typeid栏目

    在使用 dede:channelartlist 自动调用栏目内容时,经常会遇到某些栏目不需要调用,比如“关于我们”.“联系地址”等无持续更新的栏目.要想在 dede:channelartlist 调用 ...

  10. python高并发的详解

    一.什么是高并发 高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求. 高并发相关常用的一些指标有响应时间( ...