[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希望能够用这架钢琴创作出世界上最美妙的 音乐 ...
随机推荐
- ALV报表——表头实现
ABAP实现ALV表头的DEMO: 运行效果: 代码: *********************************************************************** ...
- jwt 无状态分布式授权
基于JWT(Json Web Token)的授权方式 JWT 是JSON风格轻量级的授权和身份认证规范,可实现无状态.分布式的Web应用授权: 从客户端请求服务器获取token, 用该token 去访 ...
- vs2015工程转化为vs2010
转换的步骤如下: (1)将工程是.sln用记事本打开后,更换以下信息如下: Microsoft Visual Studio Solution File, Format Version 11.00 ...
- WSL 服务自动启动
WSL 服务自动启动 参考 https://zhuanlan.zhihu.com/p/47733615 Windows 启用 WSL 功能支持 > Enable-WindowsOptionalF ...
- maven - 多模块构建
使用idea创建maven项目 点击next输入GroupId和ArtifactId 点击next创建项目,新建项目结构如下 修改demo打包方式为pom 按层级拆分创建模块model,server, ...
- metasploit情报收集
1.msf连接数据库 service postgresql start(postgresql默认用户名scott,密码tiger) msf > db_connect 用户名:密码@127.0.0 ...
- Thinkphp中的assign() 和 display()
说到 $this->assign() 与 $this->display()想必用过TP框架的都不陌生,那么今天我们就来说说他们的作用及其他用法. 先说 $this->assign( ...
- fastjson反序列化漏洞研究(上)
前言 最近护网期间,又听说fastjson传出“0day”,但网上并没有预警,在github上fastjson库中也有人提问关于fastjson反序列化漏洞的详情.也有人说是可能出现了新的绕过方式.不 ...
- 如何把SAP Kyma和SAP Cloud for Customer连接起来
首先进入SAP Cloud for Customer的Administration的工作中心,打开General Settings视图,进入Event Notification配置UI: 新建一个C4 ...
- Apache日志轮询Cronolog安装及简单用法
安装日志轮询工具cronolog: [root@bqh- tools]# tar xf cronolog-.tar.gz [root@bqh- tools]# cd cronolog- [root@b ...