[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希望能够用这架钢琴创作出世界上最美妙的 音乐 ...
随机推荐
- 【统计与建模】R语言基本操作
# vec <- rep( seq(1,5,by=0.5),3) # vec <- seq( 1 , 10 , by = 1 ) # min(vec) #最小值 # max(vec) #最 ...
- C# 简单的区块链实现
1.项目配置 首先新建一个 Asp.Net Core 项目,然后选择 Empty Project(空项目) 类型,建立完成后无需进行任何配置. 2.数据模型 这里我们来创建一个具体的区块数据模型,使用 ...
- javascript之new操作符
new 运算符做了哪些事情 1.新生成了一个对象 2.链接到原型 3.绑定 this 4.返回新对象 自己实现一个 new function create() { // 创建一个空的对象 let ob ...
- 杭电2577 多数组dp问题
Problem Description Pirates have finished developing the typing software. He called Cathy to test hi ...
- WebUploader 上传图片回显
/* fileMaxCount 最大文件数 buttonText 按钮文本 multiple 是否多选 */ (function ($) { $.fn.extend({ uploadImg: func ...
- 编写Postgres扩展之五:代码组织和版本控制
原文:http://big-elephants.com/2015-11/writing-postgres-extensions-part-v/ 编译:Tacey Wong 在关于编写Postgres扩 ...
- centos7 GNOME 安装微信客户端
写在前边 最近新装了一个 centos7 GNOME 系统,用了很久了 win,突然转换 linux 桌面版,觉得焕然一新,给搬砖生活增添了一份新意 ~ 先看一下效果图: 怎么弄呢? 下载最新版本 t ...
- VBA For Each循环
For Each循环用于为数组或集合中的每个元素执行语句或一组语句.For Each循环与For循环类似; 然而,For Each循环是为数组或组中的每个元素执行的. 因此,这种类型的循环中将不存在步 ...
- Canvas 绘制一个像素风电子时钟
想法是在 Canvas 上绘制由小方块组成的数字. 第一步是实现绘制小方块的方法,先画出一个边长为 5 的 10x10 个方块,使用两个 for 循环很简单就能完成. for (let i = 0; ...
- 使用SAP Leonardo上的机器学习服务提取图片的特征向量
要想提取图片的特征向量,首先得知道特征向量是什么. 我们假设这样一个服务场景,技师上门维修某设备,发现上面某零件损坏了,假设这位技师由于种种原因,没能根据自己的经验识别出这个零件的型号.此时技师掏出自 ...