[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希望能够用这架钢琴创作出世界上最美妙的 音乐 ...
随机推荐
- java 禁用科学计数法
禁用科学计数法 Double num = 80000000000.000001; System.out.println("默认计数法:num=" + num); NumberFor ...
- HIVE常用命令之MSCK REPAIR TABLE
MSCK REPAIR TABLE命令主要是用来解决通过hdfs dfs -put或者hdfs api写入hive分区表的数据在hive中无法被查询到的问题.我们知道hive有个服务叫metastor ...
- python 中 ModuleNotFoundError: No module named 'Crypto' 错误处理
今天在微信小程序服务端集成了微信的登录解密模块 WXBizDataCrypt,集成后运行程序时出现了下面的错误 (.venv) [1lin24@1lin24]# python manager_dev. ...
- Anaconda基础使用
Windows下Anaconda操作:在Anaconda Prompt下执行 1. Anaconda 更新 conda update conda conda update anaconda conda ...
- Linux的desktop文件正常编写赋权,仍无法打开解决办法
Linux的desktop文件正常编写赋权,仍无法打开解决办法 如果你像我一样遇到了这个问题, 明明都没有问题, desktop文件不显示图标, 双击打开是文本编辑器, 同时也有执行权限 打开却是这样 ...
- charles 右键菜单
本文参考:charles 右键菜单 在网址/域名上右键 可以获得下面菜单 区域 1 基本操作 :基本的URL复制,文件保存,以及选中文件内搜索 区域 2 重写操作 :重写发送请求(调用接口合适),或者 ...
- js中的forEach和map的区别
我们先来看两者之间的相同之处 var arr = ['a','b','c','d']; arr.forEach(function(item,index,arr){ //item表示数组中的每一项,in ...
- 《构建之法》第五次作业——Alpha项目测试
博客开头 这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/2019autumnsystemanalysisanddesign?page=6 这个作业要求在 ...
- 13. 请看TED 的演讲, 谈谈你对压力的看法,以及怎么和别人合作, 帮助别人,把压力转化为动力,在互相帮助的环境中成长。------------答题者:徐潇瑞
看了ted的演讲,我觉得压力就像一根弹簧,有多大的压力,它就有多大的弹力:现实中只要你学会用一种永远不服输的顽强精神,去对待人生和社会中遇到的一切困难与挫折,宠辱不惊的看云卷云舒,悟潮起潮落.可是存在 ...
- Redis未授权访问漏洞复现及修复方案
首先,第一个复现Redis未授权访问这个漏洞是有原因的,在 2019-07-24 的某一天,我同学的服务器突然特别卡,卡到连不上的那种,通过 top,free,netstat 等命令查看后发现,CPU ...