思路:先扫一遍所有点作为右端点的情况,把它们能产生的最大值加到一个优先队列里,然后每次从优先队列里取出最大值,再把它对应的区间的次大值加到优先队列里,这样做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 ;
}

最新文章

  1. 关于Deprecated: mysql_result: The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in
  2. multiwii 2.4配置页面中文注释
  3. HDU 5416 CRB and Tree(前缀思想+DFS)
  4. Leetcode: Repeated Substring Pattern
  5. 自定义ImageView回调实现手动改变圆环大小
  6. 【wikioi】1690 开关灯(线段树)
  7. urllib2中自定义opener
  8. daemon not running. starting it now on port 5037 ADB server didn&#39;t ACK
  9. 2、Charm Bracelet( poj 3624)简单0-1背包
  10. jQuery获取JSON格式数据方法
  11. 自定义UISlider的样式和滑块
  12. Android Studio怎样安装插件
  13. canvas绘图——根据鼠标位置进行缩放的实现原理
  14. 关于return的分号自动插入问题
  15. python——虚拟环境之virtualenvwrapper-win(windows10,64位)
  16. cf1131f 构造+并查集
  17. Visual Studio VS使用freopen调试控制台闪退
  18. 第 8 章 容器网络 - 066 - Weave 如何与外网通信?
  19. 学习 MeteoInfo二次开发教程(三)
  20. AJAX异步传输——以php文件传输为例

热门文章

  1. 20155330 《网络对抗》 Exp2 后门原理与实践
  2. 【第十三课】监控Linux系统状态
  3. CS229笔记:线性回归
  4. Spring的单例模式底层实现学习笔记
  5. PAT甲题题解-1088. Rational Arithmetic (20)-模拟分数计算
  6. ContentProvider示例
  7. 【读书笔记】Linux内核设计与实现(第一章&amp;第二章)
  8. linux 内核 第二周 操作系统是如何工作的
  9. Beta阶段冲刺-5
  10. Alpha冲刺第6天