luogu2048 [NOI2010]超级钢琴 (优先队列+主席树)
思路:先扫一遍所有点作为右端点的情况,把它们能产生的最大值加到一个优先队列里,然后每次从优先队列里取出最大值,再把它对应的区间的次大值加到优先队列里,这样做K次
可以用一个前缀和,每次找i为右端点的第K大时,就相当于找[i-R,i-L](可能有±2的偏差,会意)的第K小值,然后把它减掉
这个可以用主席树来做
为了做起来方便,下标从2开始;离散化的话会稍微快一点
这个第K大也可以不用主席树来维护,而是每次找到那个最小值以后把这个区间从那个点拆成两部分,再把这两部分加到优先队列里
#include<bits/stdc++.h>
#define pa pair<int,int>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=5e5+,logn=,inf=5e5+; inline ll rd(){
ll x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} int N,K,L,R;
int sum[maxn],tmp[maxn];
int rot[maxn],pct,cnt[maxn*logn],ch[maxn*logn][];
int tim[maxn],ori[maxn];
priority_queue<pa > q; void insert(int pre,int &p,int l,int r,int x){
p=++pct;cnt[p]=cnt[pre]+;
if(l<r){
int m=l+r>>;
if(x<=m) ch[p][]=ch[pre][],insert(ch[pre][],ch[p][],l,m,x);
else ch[p][]=ch[pre][],insert(ch[pre][],ch[p][],m+,r,x);
}
}
int query(int pre,int p,int l,int r,int k){
if(k>cnt[p]-cnt[pre]) return -inf;
if(l==r) return l;
int w=cnt[ch[p][]]-cnt[ch[pre][]],m=l+r>>;
if(k<=w) return query(ch[pre][],ch[p][],l,m,k);
else return query(ch[pre][],ch[p][],m+,r,k-w);
} int main(){
//freopen("","r",stdin);
int i,j,k;
N=rd(),K=rd();L=rd(),R=rd();
for(i=;i<=N+;i++) tmp[i]=sum[i]=sum[i-]+rd();
sort(tmp+,tmp+N+);int mm=unique(tmp+,tmp+N+)-tmp-;
for(i=;i<=N+;i++){
int x=lower_bound(tmp+,tmp+mm+,sum[i])-tmp;
ori[x]=sum[i];sum[i]=x;
// printf("%d %d\n",ori[x],sum[i]);
}
for(i=;i<=N+;i++){
insert(rot[i-],rot[i],,inf,sum[i]);
// printf("%d\n",cnt[rot[i]]);
}
ll ans=;
for(i=L+;i<=N+;i++){
int x=query(rot[max(i-R-,)],rot[i-L],,inf,tim[i]=); q.push(make_pair(ori[sum[i]]-ori[x],i));
}
for(i=;i<=K;i++){
int p=q.top().second;ans+=q.top().first;
// printf("%d %d\n",p,ans);
q.pop();tim[p]++;
int x=query(rot[max(p-R-,)],rot[p-L],,inf,tim[p]);
if(x==-inf) continue;
// printf("%d %d %d\n",p,tim[p],x);
q.push(make_pair(ori[sum[p]]-ori[x],p));
}
printf("%lld\n",ans);
return ;
}
luogu2048 [NOI2010]超级钢琴 (优先队列+主席树)的更多相关文章
- BZOJ2006[NOI2010]超级钢琴——堆+主席树
题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的 音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中 ...
- BZOJ 2006 [NOI2010]超级钢琴 (堆+主席树)
题面:BZOJ传送门 洛谷传送门 让你求前$K$大的子序列和,$n\leq 5*10^{5}$ 只想到了个$nlog^{2}n$的做法,似乎要被卡常就看题解了.. 好神奇的操作啊,我傻了 我们把序列和 ...
- 【BZOJ2006】【NOI2010】超级钢琴(主席树,优先队列)
[BZOJ2006]超级钢琴(主席树,优先队列) 题面 BZOJ 题解 既然是一段区间 首先就要变成单点 所以求一个前缀和 这个时候贪心很明显了: 枚举每一个点和可以和它组成一段的可行的点 全部丢进一 ...
- 【BZOJ2006】超级钢琴(主席树,优先队列)
[BZOJ2006]超级钢琴(主席树,优先队列) 题面 BZOJ 题解 既然是一段区间 首先就要变成单点 所以求一个前缀和 这个时候贪心很明显了: 枚举每一个点和可以和它组成一段的可行的点 全部丢进一 ...
- BZOJ 2006 超级钢琴(堆+主席树)
很好的一道题. 题意:给出长度为n的数列,选择k个互不相同的区间,满足每个区间长度在[L,R]内,求所有选择的区间和的总和最大是多少.(n,k<=5e5). 首先将区间和转化为前缀和之差,那么我 ...
- JZOJ5409. Fantasy && Luogu2048 [NOI2010]超级钢琴
题目大意 给出一个序列和\(L, R\), 求前k大长度在\([L,R]\)之间的连续子序列的和的和. 解题思路 朴素的想法是对于一个左端点\(p\), 它的右区间取值范围是一个连续的区间即\([p+ ...
- [BZOJ2006] [NOI2010]超级钢琴 主席树+贪心+优先队列
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 3591 Solved: 1780[Submit][Statu ...
- [NOI2010]超级钢琴 主席树
[NOI2010]超级钢琴 链接 luogu 思路 和12省联考的异或粽子一样. 堆维护n个左端点,每次取出来再放回去次 代码 #include <bits/stdc++.h> #defi ...
- 【BZOJ 2006】2006: [NOI2010]超级钢琴(RMQ+优先队列)
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2792 Solved: 1388 Description 小 ...
随机推荐
- ccf201703-2学生排队
问题描述 体育老师小明要将自己班上的学生按顺序排队.他首先让学生按学号从小到大的顺序排成一排,学号小的排在前面,然后进行多次调整.一次调整小明可能让一位同学出队,向前或者向后移动一段距离后再插入队列. ...
- Vivado中xilinx_courdic IP核(求exp指数函数)使用
由于Verilog/Vhdl没有计算exp指数函数的库函数,所以在开发过程中可利用cordic IP核做exp函数即e^x值: 但前提要保证输入范围在(-pi/4—pi/4) 在cordic核中e^x ...
- 2017-2018-2 20155231《网络对抗技术》实验五: MSF基础应用
2017-2018-2 20155231<网络对抗技术>实验五: MSF基础应用 实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 实验内容 (1)各种搜索技巧的应用 比如IP2L ...
- 【WPF】两则动画效果
原文:[WPF]两则动画效果 引言 利用WPF的动画可以轻而易举的实现各种各样的特效,如擦除,滑动进入等,先看两个效果图 第一个效果 这个动画其实利用了OpacityMask和LinearGradie ...
- Java入门知识1
1. 获取标准屏幕的输入时,需导入java.util.Scanner包. 2. 主类的名称与.java的文件名需一致. 3. 文件中主类设置为public,其他类前面无需加访问级别. 4. 继承时,使 ...
- AngularJS 的异步服务测试与Mocking
测试 AngularJS 的异步服务 最近,在做项目时掉进了 AngularJS 异步调用 $q 测试的坑中,直接躺枪了.折腾了许久日子,终于想通了其中的道道,但并不确定是最佳的解决方案,最后还是决定 ...
- 阿里云rds 备份和还原
阿里云rds 备份和还原 转发:https://www.cnblogs.com/lin1/p/8617764.html 转发:https://help.aliyun.com/knowledge_det ...
- AHD/TVI/CVI/CVBS/IP
1.CVBS是最早的模拟摄像机,现在看来效果差. 2.AHD TVI CVI都是模拟摄像机的升级版,俗称同轴,三种名称只是用的方案系统不一样而已,相比模拟的效果清晰,和模拟的外观都是一样的bn ...
- 一个Boss直聘机器人, 自动回复发简历
goBoss 基佬github地址 这是基于go语言编写的一款boss直聘机器人软件(牛人版).附上Python版本, 无需配置Go环境, 我会提供windows和macos的可执行程序.不喜勿喷O( ...
- Flink standalone模式作业执行流程
宏观流程如下图: client端 生成StreamGraph env.addSource(new SocketTextStreamFunction(...)) .flatMap(new FlatMap ...