luogu2048 [NOI2010]超级钢琴 (优先队列+主席树)
2024-10-19 03:25:46
思路:先扫一遍所有点作为右端点的情况,把它们能产生的最大值加到一个优先队列里,然后每次从优先队列里取出最大值,再把它对应的区间的次大值加到优先队列里,这样做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 ;
}
最新文章
- 关于Deprecated: mysql_result: The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in
- multiwii 2.4配置页面中文注释
- HDU 5416 CRB and Tree(前缀思想+DFS)
- Leetcode: Repeated Substring Pattern
- 自定义ImageView回调实现手动改变圆环大小
- 【wikioi】1690 开关灯(线段树)
- urllib2中自定义opener
- daemon not running. starting it now on port 5037 ADB server didn&#39;t ACK
- 2、Charm Bracelet( poj 3624)简单0-1背包
- jQuery获取JSON格式数据方法
- 自定义UISlider的样式和滑块
- Android Studio怎样安装插件
- canvas绘图——根据鼠标位置进行缩放的实现原理
- 关于return的分号自动插入问题
- python——虚拟环境之virtualenvwrapper-win(windows10,64位)
- cf1131f 构造+并查集
- Visual Studio VS使用freopen调试控制台闪退
- 第 8 章 容器网络 - 066 - Weave 如何与外网通信?
- 学习 MeteoInfo二次开发教程(三)
- AJAX异步传输——以php文件传输为例