题意:给一个序列(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 ;
}

bzoj2006: [NOI2010]超级钢琴的更多相关文章

  1. bzoj2006 [NOI2010]超级钢琴 (及其拓展)

    bzoj2006 [NOI2010]超级钢琴 给定一个序列,求长度在 \([L,\ R]\) 之间的区间和的前 \(k\) 大之和 \(n\leq5\times10^5,\ k\leq2\times1 ...

  2. bzoj千题计划162:bzoj2006: [NOI2010]超级钢琴

    http://www.lydsy.com/JudgeOnline/problem.php?id=2006 输出最大的k个 sum[r]-sum[l-1] (L<=r-l+1<=R) 之和 ...

  3. BZOJ2006 [NOI2010]超级钢琴 【堆 + RMQ】

    2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 552 MB Submit: 3446  Solved: 1692 [Submit][Sta ...

  4. [BZOJ2006][NOI2010]超级钢琴(ST表+堆)

    2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 3679  Solved: 1828[Submit][Statu ...

  5. [BZOJ2006] [NOI2010]超级钢琴 主席树+贪心+优先队列

    2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 3591  Solved: 1780[Submit][Statu ...

  6. bzoj2006 noi2010 超级钢琴 主席树 + 优先队列

    Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2435  Solved: 1195 Description 小 Z是一个小有名气的钢琴家,最近C博士送 ...

  7. BZOJ2006[NOI2010]超级钢琴——堆+主席树

    题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的 音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中 ...

  8. 【贪心 计数】bzoj2006: [NOI2010]超级钢琴

    这么经典的贪心我怎么现在才做啊…… Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的 音乐. 这架超级钢琴可以弹奏出n个 ...

  9. BZOJ2006——[NOI2010]超级钢琴

    1.题意:给一个序列,让你取出k个不同的区间,要求长度在之间,问所有区间和的最大值 2.分析:这道题拿过来就能知道是要拿出前k个最大的区间,我们思考最暴力的做法,就是把这个所有的区间枚举出来算,取出前 ...

随机推荐

  1. Dom中的继承关系

    首先声明,一些内容基于个人猜测,如果哪里有错误,请立即联系在下! 我们用js操作Dom时,会经常用到一些个方法比如基于获取到的元素选择其子元素: <!DOCTYPE html> <h ...

  2. FUNCTION

    1,FUNCTION-1 CREATE FUNCTION `vendor_area_child_ids`(rootId INT) ) BEGIN ); ); SET pTemp = '$'; SET ...

  3. DISCUZ官方论坛模仿开发日志(二)

    接上一次日志:http://www.cnblogs.com/gcs1995/p/4091159.html 从上次写下项目简要分析到现在差不多两个月时间了,这两个月时间学习了很多新技术: 数据库技术: ...

  4. WordPress 插件推荐

    1.电商类: Woocommerce 2.幻灯片: Reslider 3.网页编写类: js_composer

  5. 参考__Larvel

    环境搭建 Vagrant PSR规范 PHP 标准规范(中文版)PHP 标准规范(Github版)PHP 标准规范官网 社区 laravel-china官网Larvel学院

  6. position之fixed固定定位、absolute绝对定位和relative相对定位

    什么是层模型? 什么是层布局模型?层布局模型就像是图像软件PhotoShop中非常流行的图层编辑功能一样,每个图层能够精确定位操作,但在网页设计领域,由于网页大小的活动性,层布局没能受到热捧.但是在网 ...

  7. VMWARE里启动kylin16.0时出现'SMBus Host Controller not enabled'(还未进入系统)

    在Vmware里安装完Ubuntu16.10,启动时出现'SMBus Host Controller not enabled'错误提示,进不到图形界面.网上搜了一下,解决办法是在图形界面里进终端窗口, ...

  8. Cordova+Ionic之坑

    命令:ionic platform add android 报错:Unable to start the daemon process…… 解决: 1)添加环境变量[_JAVA_OPTIONS],值: ...

  9. 第一章 Java的I/O演进之路

    I/O基础入门 Java的I/O演进 第一章 Java的I/O演进之路 1.1 I/O基础入门 1.1.1 Linux网络I/O模型简介 根据UNIX网络编程对I/O模型的分类,UNIX提供了5中I/ ...

  10. mybatis 对于基本类型数据传值的问题

    最近在开发的时候,遇到一个小问题: Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter fo ...