BZOJ_2006_[NOI2010]超级钢琴_贪心+堆+ST表
BZOJ_2006_[NOI2010]超级钢琴_贪心+堆+ST表
Description
Input
Output
只有一个整数,表示乐曲美妙度的最大值。
Sample Input
3
2
-6
8
Sample Output
11
把所有的子串当成后缀的前缀来做。
那么对于从i这个位置开始的子串,有一个可以选取末位置j的范围[i+L-1,i+R-1]。
假设最大的合法子串在j这个位置,那么次大值一定出现在[i+L-1,j-1]和[j+1,i+R-1]中。
于是有了这样的想法:用堆来维护四元组<i,p,l,r>表示从i到p的子段,选择的范围从l到r。
然后每次查询区间最大值用ST表做即可。
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <ext/pb_ds/priority_queue.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
#define N 500050
int n,a[N],s[N],K,L,R,f[N][21],Lg[N],g[N][21];
ll ans;
struct A {
int x,p,l,r;
A() {}
A(int x_,int p_,int l_,int r_) :
x(x_),p(p_),l(l_),r(r_) {}
};
bool operator < (const A &x,const A &y) {
return s[x.p]-s[x.x-1]<s[y.p]-s[y.x-1];
}
__gnu_pbds::priority_queue<A>q;
int get_max(int l,int r) {
int len=Lg[r-l+1];
return f[l][len]>f[r-(1<<len)+1][len]?g[l][len]:g[r-(1<<len)+1][len];
}
void solve() {
int i;
for(i=1;i<=n-L+1;i++) {
int t=get_max(i+L-1,min(n,i+R-1));
q.push(A(i,t,i+L-1,min(n,i+R-1)));
}
for(i=1;i<=K;i++) {
A t=q.top(); q.pop();
//printf("%d %d\n",t.x,t.p);
ans+=s[t.p]-s[t.x-1];
if(t.p>t.l) q.push(A(t.x,get_max(t.l,t.p-1),t.l,t.p-1));
if(t.p<t.r) q.push(A(t.x,get_max(t.p+1,t.r),t.p+1,t.r));
}
}
int main() {
scanf("%d%d%d%d",&n,&K,&L,&R);
int i,j;
Lg[0]=-1;
for(i=1;i<=n;i++) {
scanf("%d",&a[i]);
s[i]=s[i-1]+a[i];
f[i][0]=s[i];
g[i][0]=i;
Lg[i]=Lg[i>>1]+1;
}
Lg[0]=0;
for(j=1;(1<<j)<=n;j++) {
for(i=1;i+(1<<j)-1<=n;i++) {
if(f[i][j-1]>f[i+(1<<j-1)][j-1]) {
f[i][j]=f[i][j-1];
g[i][j]=g[i][j-1];
}else {
f[i][j]=f[i+(1<<j-1)][j-1];
g[i][j]=g[i+(1<<j-1)][j-1];
}
}
}
solve();
printf("%lld\n",ans);
}
BZOJ_2006_[NOI2010]超级钢琴_贪心+堆+ST表的更多相关文章
- P2048 [NOI2010]超级钢琴(RMQ+堆+贪心)
P2048 [NOI2010]超级钢琴 区间和--->前缀和做差 多次查询区间和最大--->前缀和RMQ 每次取出最大的区间和--->堆 于是我们设个3元组$(o,l,r)$,表示左 ...
- 【NOI2010】超级钢琴 题解(贪心+堆+ST表)
题目链接 题目大意:求序列内长度在$[L,R]$范围内前$k$大子序列之和. ---------------------- 考略每个左端点$i$,合法的区间右端点在$[i+L,i+R]$内. 不妨暴力 ...
- [NOI2010]超级钢琴(RMQ+堆)
小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中Ai可正可负 ...
- [NOI2010] 超级钢琴 - 贪心,堆,ST表
这也算是第K大问题的套路题了(虽然我一开始还想了个假算法),大体想法就是先弄出最优的一批解,然后每次从中提出一个最优解并转移到一个次优解,用优先队列维护这个过程即可. 类似的问题很多,放在序列上的,放 ...
- BZOJ 2006 NOI2010 超级钢琴 划分树+堆
题目大意:给定一个序列.找到k个长度在[l,r]之间的序列.使得和最大 暴力O(n^2logn),肯定过不去 看到这题的第一眼我OTZ了一下午... 后来研究了非常久别人的题解才弄明确怎么回事...蒟 ...
- [BZOJ2006][NOI2010]超级钢琴(ST表+堆)
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 3679 Solved: 1828[Submit][Statu ...
- [ST表/贪心] NOI2010 超级钢琴
[NOI2010]超级钢琴 题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i ...
- Bzoj 2006: [NOI2010]超级钢琴 堆,ST表
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2222 Solved: 1082[Submit][Statu ...
- 【BZOJ2006】[NOI2010]超级钢琴 ST表+堆
[BZOJ2006][NOI2010]超级钢琴 Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以 ...
随机推荐
- OpenNMS安装手册
一. 系统需求Windows Server 2008 R2 SP1 64位JDK 8 update 5 for Windows 64位PostgreSQL 9.3.5 for Windows 64位O ...
- node_acl 路径通配
最近做一个基于nodejs的权限管理,查阅了一两天,发现大致是这样的: passportjs node-oauth rbac node_acl express_acl connect-roles 需求 ...
- 第1章-Struts2 概述 --- Struts2和MVC
(一)Struts2和MVC的关系图: (1)控制器---FilterDispatcher 用户请求首先达到前段控制器(FilterDispatcher).FilterDispatcher负责根据用户 ...
- java并发包小结(一)
java.util.concurrent 包含许多线程安全.高性能的并发构建块.换句话讲,创建 java.util.concurrent 的目的就是要实现 Collection 框架对数据结构所执行的 ...
- Apache Flink Quickstart
Apache Flink 是新一代的基于 Kappa 架构的流处理框架,近期底层部署结构基于 FLIP-6 做了大规模的调整,我们来看一下在新的版本(1.6-SNAPSHOT)下怎样从源码快速编译执行 ...
- 利用HTML5,前端js实现图片压缩
http://blog.csdn.NET/qazwsx2345/article/details/21827553 主要用了两个HTML5的 API,一个file,一个canvas,压缩主要使用cnav ...
- 黄文俊:Serverless小程序后端技术分享
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 黄文俊,现任腾讯云SCF无服务器云函数高级产品经理,多年企业级系统开发和架构工作经验,对企业级存储.容器平台.微服务架构.无服务器计算等领域 ...
- 前端应该了解的PWA
一.传统web 应用 当前web应用在移动时代并没有达到其在桌面设备上流行的程度,下面有张图来对比与原生应用之间的差别. 究其原因,无外乎下面不可避免的几点: 移动设备网络限制-不可忽略的加载时间 w ...
- python 编码形式简单入门
为什么使用Python 假设我们有这么一项任务:简单测试局域网中的电脑是否连通.这些电脑的ip范围从192.168.0.101到192.168.0.200. 思路:用shell编程.(Linux通常是 ...
- 源码分析Session的台前幕后(Asp .Net MVC5)
在这篇文章里,我们从源代码的角度重点分析Session的创建.缓存.销毁.管理. 通常我们说的Session指的是在控制器中使用的Session字段,该字段的类型是HttpSessionState.可 ...