http://www.lydsy.com/JudgeOnline/problem.php?id=2006 (题目链接)

题意

  给出一个数列,在其中选出K个长度在${[L,R]}$之间的不同的区间,使得他们的和权值和最大。

Solution

  我们可以先处理处它的前缀和${sum}$,然后用ST表维护前缀和的区间最小值。做完这些预处理以后,我们从L for 到n,每次在区间${[i-R,i-L]}$中取出前缀和最小的${sum[M]}$,与${sum[i]}$相减,丢入堆中。之后我们每次取出堆顶元素加入答案,并分别找出区间${[i-R,M-1]}$和${[M+1,i-L]}$的前缀和最小的${sum[M1],sum[M2]}$,分别相减,丢入堆中。以此类推,直到取出${K}$个元素为止。

代码

// bzoj2006
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define LL long long
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std;
inline int getint() {
int x=0,f=1;char ch=getchar();
while (ch>'9' || ch<'0') {if (ch=='-') f=-1;ch=getchar();}
while (ch>='0' && ch<='9') {x=x*10+ch-'0';ch=getchar();}
return x*f;
} const int maxn=500010;
struct data {
int l,r,m,i;LL w;
friend bool operator < (const data &a,const data &b) {
return a.w<b.w;
}
};
priority_queue<data> q;
int ST[maxn][30],bin[30],a[maxn],Log[maxn];
LL s[maxn];
int n,K,L,R; inline int mina(register int x,register int y) {
return s[x]<s[y] ? x : y;
}
inline int query(register int l,register int r) {
int k=Log[r-l+1];
return mina(ST[l][k],ST[r-bin[k]+1][k]);
}
int main() {
bin[0]=1;for (int i=1;i<=19;i++) bin[i]=bin[i-1]<<1;
n=getint(),K=getint(),L=getint(),R=getint();
for (int i=1;i<=n;i++) s[i]=getint(),s[i]+=s[i-1];
for (int i=1;i<=n;i++) ST[i][0]=i;
for (int i=2;i<=n;i++) Log[i]=Log[i>>1]+1;
for (int j=1;j<=19;j++)
for (int i=0;i+bin[j]<=n+1;i++)
ST[i][j]=mina(ST[i][j-1],ST[i+bin[j-1]][j-1]);
for (int i=L;i<=n;i++) {
int l=max(i-R,0),r=i-L;
int x=query(l,r);
q.push((data){l,r,x,i,s[i]-s[x]});
}
LL ans=0;
while (K--) {
data t=q.top();ans+=t.w;q.pop();
if (t.l<t.m) {
int x=query(t.l,t.m-1);
q.push((data){t.l,t.m-1,x,t.i,s[t.i]-s[x]});
}
if (t.m<t.r) {
int x=query(t.m+1,t.r);
q.push((data){t.m+1,t.r,x,t.i,s[t.i]-s[x]});
}
}
printf("%lld",ans);
return 0;
}

  

  

【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个最大的区间,我们思考最暴力的做法,就是把这个所有的区间枚举出来算,取出前 ...

  10. bzoj2006: [NOI2010]超级钢琴

    题意:给一个序列(n<=500000),要求选定k个不同区间,使得区间长度在L,R之间,并使得k个区间和之和最大,输出这个最大值. 刚拿到题的时候想的是,对于每个点,如果以它开头,那么之后的L- ...

随机推荐

  1. C#.NET 大型通用信息化系统集成快速开发平台 4.0 版本 - 多系统开发接口 - 苹果客户端开发接口

    最近工作上需要,给苹果客户端开发接口,实现集中统一的用户管理,下面是接口调用参考. 1: 获取OpenId? http://127.0.0.1/GetOpenId.ashx?username=Admi ...

  2. QT QDateTime类、QTimer类

    QDateTime类,头文件#include <QDateTime> 可以使用QDateTime类来获得系统时间.通过QDateTime::currentDateTime()来获取本地系统 ...

  3. Qt中forward declaration of struct Ui::xxx的解决

    每当你新键一个 QT设计界面, QT会自动生成yyy.ui文件,如 <?xml version="1.0" encoding="UTF-8"?> & ...

  4. 从零开始搭建架构实施Android项目

    我们先假设一个场景需求:刚有孩子的爸爸妈妈对用照片.视频记录宝宝成长有强烈的意愿,但苦于目前没有一款专门的手机APP做这件事.A公司洞察到市场需求,要求开发团队尽快完成Android客户端的开发.以下 ...

  5. TrueSkill 原理及实现

    在电子竞技游戏中,特别是当有多名选手参加比赛的时候需要平衡队伍间的水平,让游戏比赛更加有意思.这样的一个参赛选手能力平衡系统通常包含以下三个模块: 一个包含跟踪所有玩家比赛结果,记录玩家能力的模块. ...

  6. Spearman Rank(斯皮尔曼等级)相关系数及MATLAB实现

    转自:http://blog.csdn.net/wsywl/article/details/5859751 Spearman Rank(斯皮尔曼等级)相关系数 1.简介 在统计学中,斯皮尔曼等级相关系 ...

  7. JavaScript学习笔记-选择器集合调用方法

    <script type="text/javascript"> function uu(namePd) { //判断id var reId = new RegExp(/ ...

  8. 15-grep 简明笔

    在文件中搜索模式 grep [options] pattern [file-list] 参数 pattern为正则表达式,file-list为grep要搜索的普通文本文件的路径名列表 选项 -c    ...

  9. php 实现接收客户端上传的图片

    今天,遇到一个服务端接收客户端上传图片的需求,经过学习.我写了个简单的demo 以备下次学习. 首先服务器接收的发送图片的请求一定要是post请求,而且请求一定要加上 enctype="mu ...

  10. git 查看生成对象

    1. find .   查看目录中所有对象 2. find .git/objects 查看所有对象 3. git cat-file -p 散列值  输出文件内容