BZOJ 2006: [NOI2010]超级钢琴 ST表+堆
开始想到了一个二分+主席树的 $O(n\log^2 n)$ 的做法.
能过,但是太无脑了.
看了一下题解,有一个 ST 表+堆的优美解法.
你发现肯定是选取前 k 大最优.
然后第一次选的话直接选固定左端点,最优的右端点就行.
但是呢,这个右端点选完后就不能再选了,于是你把这个区间分成两个,再扔到堆里,这么迭代就行.
code:
#include <bits/stdc++.h>
#define LOG 20
#define N 500005
#define ll long long
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
ll sum[N],MIN[N][LOG];
namespace RMQ
{
void init(int n)
{
for(int i=1;i<=n;++i) MIN[i][0]=i;
for(int j=1;(1<<j)<=n;++j)
{
for(int i=1;i+(1<<j)-1<=n;++i)
{
int x=MIN[i][j-1], y=MIN[i+(1<<(j-1))][j-1];
MIN[i][j]=sum[x]>sum[y]?x:y;
}
}
}
int query(int l,int r)
{
int k=log2(r-l+1);
int x=MIN[l][k], y=MIN[r-(1<<k)+1][k];
return sum[x]>sum[y]?x:y;
}
};
struct element
{
int o,l,r,t;
element() {}
element(int o,int l,int r):o(o),l(l),r(r),t(RMQ::query(l,r)){}
friend bool operator<(const element&a,const element &b)
{
return sum[a.t]-sum[a.o-1]<sum[b.t]-sum[b.o-1];
}
};
priority_queue<element>Q;
int main()
{
// setIO("input");
int n,k,L,R,i,j;
scanf("%d%d%d%d",&n,&k,&L,&R);
for(i=1;i<=n;++i)
{
scanf("%lld",&sum[i]);
sum[i]+=sum[i-1];
}
RMQ::init(n);
for(i=1;i<=n;++i)
{
if(i+L-1<=n) Q.push(element(i,i+L-1,min(i+R-1,n)));
}
ll ans=0;
while(k--)
{
int o=Q.top().o,l=Q.top().l,r=Q.top().r,t=Q.top().t;
Q.pop();
ans+=sum[t]-sum[o-1];
if(l!=t) Q.push(element(o,l,t-1));
if(t!=r) Q.push(element(o,t+1,r));
}
printf("%lld\n",ans);
return 0;
}
BZOJ 2006: [NOI2010]超级钢琴 ST表+堆的更多相关文章
- bzoj 2006 [NOI2010]超级钢琴——ST表+堆
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2006 每个右端点的左端点在一个区间内:用堆记录端点位置.可选区间,按价值排序:拿出一个后也许 ...
- BZOJ 2006: [NOI2010]超级钢琴 [ST表+堆 | 主席树]
题意: 一个序列,求k个不相同的长度属于\([L,R]\)的区间使得和最大 前缀和,对于每个r找最小的a[l] 然后我yy了一个可持久化线段树做法...也许会T 实际上主席树就可以了,区间k小值 然后 ...
- [BZOJ2006][NOI2010]超级钢琴(ST表+堆)
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 3679 Solved: 1828[Submit][Statu ...
- 【BZOJ2006】[NOI2010]超级钢琴 ST表+堆
[BZOJ2006][NOI2010]超级钢琴 Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以 ...
- BZOJ 2006 NOI2010 超级钢琴 划分树+堆
题目大意:给定一个序列.找到k个长度在[l,r]之间的序列.使得和最大 暴力O(n^2logn),肯定过不去 看到这题的第一眼我OTZ了一下午... 后来研究了非常久别人的题解才弄明确怎么回事...蒟 ...
- Bzoj 2006: [NOI2010]超级钢琴 堆,ST表
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2222 Solved: 1082[Submit][Statu ...
- BZOJ 2006: [NOI2010]超级钢琴( RMQ + 堆 )
取最大的K个, 用堆和RMQ来加速... ----------------------------------------------------------------- #include<c ...
- 【BZOJ-2006】超级钢琴 ST表 + 堆 (一类经典问题)
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2473 Solved: 1211[Submit][Statu ...
- BZOJ 2006: [NOI2010]超级钢琴
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2613 Solved: 1297[Submit][Statu ...
随机推荐
- 深度学习-CNN+RNN笔记
以下叙述只是简单的叙述,CNN+RNN(LSTM,GRU)的应用相关文章还很多,而且研究的方向不仅仅是下文提到的1. CNN 特征提取,用于RNN语句生成图片标注.2. RNN特征提取用于CNN内容分 ...
- 挂载一个NFS共享
在 system2 上挂载一个来自 system1.group8.example.com 的NFS共享,并符合下列要求: 1./public 挂载在下面的目录上 /mnt/nfsmount 2./pr ...
- 【题解】Luogu P5300 [GXOI/GZOI2019]与或和
原题传送门 我们珂以拆位,拆成一个个0/1矩阵 贡献珂以用全0,全1的子矩阵的个数来计算 全0,全1的子矩阵的个数珂以用悬线法/单调栈解决 #include <bits/stdc++.h> ...
- git学习笔记 ---添加远程库
现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举 ...
- idea 添加 VUE 的语法
1,首先我们先让 HTML 文件支持 VUE 的语法指令提示 2,File -> Setting -> Edit -> Inspections -> html 3.加入以下: ...
- 如何大幅提高百度云文件的下载速度?油猴+user-agent-switcher+PanDownload使用教程
最近尝试了提高百度云下载速度的方法,最后效果还不错,提供给大家参考.效果如图: 第一步:下载油猴插件 (截图来自word文档,所以是反的^_^||) 第二步:在油猴中添加新插件 搜索百度网盘 添加插 ...
- c#利用定时器自动备份数据库(mysql)
1:引用dll MySql.Data.dll, MySqlbackup.dll 2:建一个数据连接静态类 public static class mysql{public static strin ...
- java之 代理设计模式
1. 设计一个案例来实现租房功能.分析:在租房的过程中涉及到了3个对象,房东,中介,房客. 中介和房客具有相同的功能--租房. 可以设计如下: 2.上图的设计实际上就是一个代理设计模式---静态代理设 ...
- 2019 快乐阳光java面试笔试题 (含面试题解析)
本人3年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.快乐阳光等公司offer,岗位是Java后端开发,最终选择去了快乐阳光. 面试了很多家公司,感觉大部分公司考察的点 ...
- Laravel 5.5 发布,ThinkSNS+ 升级及状况分享
升级场景 ThinkSNS+ 一直依赖,都是保留 Laravel 的 commit 记录的前提下,进行开发,为了追随 Laravel 的升级,我们在本地的仓库中新建了一个分支,如果 laravel 更 ...