题意:给一个序列(n<=500000),要求选定k个不同区间,使得区间长度在L,R之间,并使得k个区间和之和最大,输出这个最大值。

刚拿到题的时候想的是,对于每个点,如果以它开头,那么之后的L-1个一定被选,剩下的R-L个可选,对这一部分进行最大前缀和就好啦!用主席树搞搞,建树的时候维护下就好了。

但有个问题,以这个区间为开头的情况不止一种,这种做法确实能求出以它开头的最大值,那次大值,k大值呢?这也是有可能计入答案的。所以不行。

正解是,对于一个位置,如果我们考虑以它结尾,这个区间等于它的前缀和减去前面一个位置的前缀和,其中位置i满足i离这个位置不小于L不超过R。对于这个位置,我们只需要找这个区间内的区间k大,用这个位置前缀和减掉就好了,然后去求区间k+1大。放入一个堆中取k次就好。

 #include<bits/stdc++.h>
using namespace std;
#define N 500005
#define LL long long
inline int read(){
int x=,f=; char a=getchar();
while(a<'' || a>'') {if(a=='-') f=-; a=getchar();}
while(a>='' && a<='') x=x*+a-'',a=getchar();
return x*f;
}
LL sum[N];
struct data{
int num,k;LL val;
bool operator < (const data& w)const{
return val<w.val;
}
}t;
priority_queue<data>q;
namespace Chairman_Tree{
int root[N],size;
struct ct{
int son[],sz;
}tr[];
void insert(int x,int& y,LL l,LL r,LL v){
y=++size; tr[y].sz=tr[x].sz+;
if(l==r) return;
memcpy(tr[y].son,tr[x].son,sizeof(tr[y].son));
int mid=(l+r)>>;
if(mid>=v) insert(tr[x].son[],tr[y].son[],l,mid,v);
else insert(tr[x].son[],tr[y].son[],mid+,r,v);
}
LL query(int x,int y,LL l,LL r,int k){
if(tr[y].sz-tr[x].sz<k) return 1e9;
if(l==r) return l;
int mid=(l+r)>>,s=tr[tr[y].son[]].sz-tr[tr[x].son[]].sz;
if(k<=s) return query(tr[x].son[],tr[y].son[],l,mid,k);
else return query(tr[x].son[],tr[y].son[],mid+,r,k-s);
}
}
#define CT Chairman_Tree
#define L -500000005
#define R 500000005
int main(){
int n=read(),k=read(),l=read(),r=read();
LL ans=; CT::insert(,CT::root[],L,R,);
for(int i=;i<=n;i++) sum[i]=sum[i-]+read();
for(int i=;i<=n;i++) CT::insert(CT::root[i-],CT::root[i],L,R,sum[i]);
for(int i=l;i<=n;i++){
int ri=i-l,le=i-r-;
LL tmp;
if(le<) tmp=CT::query(,CT::root[ri],L,R,);
else tmp=CT::query(CT::root[le],CT::root[ri],L,R,);
q.push((data){i,,sum[i]-tmp});
}
while(k--){
t=q.top(); q.pop();
ans+=t.val;
int ri=t.num-l,le=t.num-r-; LL tmp;
if(le<) tmp=CT::query(,CT::root[ri],L,R,t.k+);
else tmp=CT::query(CT::root[le],CT::root[ri],L,R,t.k+);
q.push((data){t.num,t.k+,sum[t.num]-tmp});
}
cout<<ans;
return ;
}

最新文章

  1. Intel Media SDK H264 encoder GOP setting
  2. 解决虚拟机VMware安装CentOS7.0识别不到网卡
  3. python unicode转中文及转换默认编码
  4. 【CodeForces 672B】Different is Good
  5. 20145215《Java程序设计》第7周学习总结
  6. (转)对DotNet分布式应用搭建的考虑
  7. WCF扩展
  8. utf-8 和gbk编码的差别
  9. POJ3484 Showstopper (二分+字符串处理)
  10. HOOK API(四)—— 进程防终止
  11. STM32之FreeRTOS
  12. 模块中为什么要加__name__ == &quot;__main__&quot;
  13. 深入hibernate的三种状态
  14. MySQL 之 数据库自动生成ID格式化编号(字符串格式化填充/拼接/时间)
  15. 搭建ldap服务器及web管理服务--phpldapadmin
  16. 前端UI框架之layUI学习
  17. 梦殇 chapter four
  18. 转录组表达量计RPKM、FPKM、TPM说明
  19. 2018.10.23 NOIP模拟 战争(并查集)
  20. Vmware vSphere 开启嵌套虚拟化

热门文章

  1. 构建ceph deb 安装包
  2. eclipse上修改js后,浏览器上还是出现原来效果的解决方法
  3. ionic 中$ionicView.beforeEnter 事件的一个bug
  4. 学习git与github的二三bug
  5. 微信小程序-媒体组件
  6. C#常用错误
  7. Java学习路线图,专为新手定制的Java学习计划建议
  8. django数据库的增删改查
  9. java.nio.file.Path
  10. Php中的强制转换详解