Link:

https://www.lydsy.com/JudgeOnline/problem.php?id=2006

Algorithm:

对于此类区间最值类问题,我们可以通过控制一端不变来寻找当前点的最值,再综合比较

此题中,在求完前缀和后,在左端点确定的情况下,只要寻找前缀和最大的右端点

为了快速寻找最优的右端点位置,我们需要RMQ来进行维护

由于不存在修改操作而只有查询,那么ST List  O(1)查询 O(n)修改  的特性就能充分利用

在求出前缀和后用ST list维护区间MAX即可

定义一个四元组(i,L,R,pos),其中,i表示固定下的左端点,L,R表示右端点存在的区间,pos表示右端点此时最优位置

为了不涉及到ST list不支持的删除操作,在选定pos后四元组分为两段:

$(i,L,R,pos)−>(i,L,pos−1,pos′)+(i,pos+1,R,pos′′)$

这样用优先队列每次取出最优解即可

Code:

//by NewErA
#include<bits/stdc++.h> using namespace std;
typedef long long ll; inline int read()
{
char ch;int num,f=;
while(!isdigit(ch=getchar())) f|=(ch=='-');
num=ch-'';
while(isdigit(ch=getchar())) num=num*+ch-'';
return f?-num:num;
} struct SP
{
int i,l,r,pos;
}; const int MAXN=;
int n,k,L,R,a[MAXN],log_2[MAXN],st[MAXN][];
ll res=; void init()
{
log_2[]=;
for(int i=;i<=n;i++)
{
log_2[i]=log_2[i-];
if(<<(log_2[i]+)==i) log_2[i]++;
} for(int i=n;i>=;i--)
{
st[i][]=i;
for(int j=;(i+(<<j)-)<=n;j++)
if(a[st[i][j-]]>a[st[i+(<<(j-))][j-]]) st[i][j]=st[i][j-];
else st[i][j]=st[i+(<<(j-))][j-];
}
} int Query(int l,int r)
{
int x=log_2[r-l+];
if(a[st[l][x]]>a[st[r-(<<x)+][x]]) return st[l][x];
else return st[r-(<<x)+][x];
} inline bool operator < (SP x,SP y) //运算符重载
{
return a[x.pos]-a[x.i-]<a[y.pos]-a[y.i-];
} int main()
{
n=read();k=read();L=read();R=read();
for(int i=;i<=n;i++) a[i]=read();
for(int i=;i<=n;i++) a[i]+=a[i-]; init(); priority_queue<SP,vector<SP> > Q;
for(int i=;i<=n;i++)
if(i+L-<=n)
{
int t=min(i+R-,n);
Q.push(SP{i,i+L-,t,Query(i+L-,t)});
}
while(k--)
{
SP cur=Q.top();Q.pop();
res+=a[cur.pos]-a[cur.i-];
if(cur.pos->=cur.l) Q.push(SP{cur.i,cur.l,cur.pos-,Query(cur.l,cur.pos-)});
if(cur.pos+<=cur.r) Q.push(SP{cur.i,cur.pos+,cur.r,Query(cur.pos+,cur.r)});
}
cout << res;
return ;
}

1、priority_queue的运算符重载问题(Updating)

2、只需要RMQ的查询操作时尽量用ST List

3、如果删除1个或少量数据的操作难以实现时,考虑将原数据分段,递归式地考虑每一段的情况

[BZOJ 2006] 超级钢琴的更多相关文章

  1. BZOJ 2006 超级钢琴(划分树+优先队列)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2006 题意: 给出一个数列A,L,R,构造出一个新的集合,集合中的数字为A中任意连续t( ...

  2. bzoj 2006 超级钢琴 —— ST表

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2006 本来应该是可以用主席树,找区间最小值,取出来后再找那段区间的次小值...... 但也可 ...

  3. BZOJ 2006 超级钢琴(堆+主席树)

    很好的一道题. 题意:给出长度为n的数列,选择k个互不相同的区间,满足每个区间长度在[L,R]内,求所有选择的区间和的总和最大是多少.(n,k<=5e5). 首先将区间和转化为前缀和之差,那么我 ...

  4. [BZOJ 2006] [NOI 2010]超级钢琴(贪心+ST表+堆)

    [BZOJ 2006] [NOI 2010]超级钢琴(贪心+ST表+堆) 题面 给出一个长度为n的序列,选k段长度在L到R之间的区间,一个区间的值等于区间内所有元素之的和,使得k个区间的值之和最大.区 ...

  5. BZOJ 2006: [NOI2010]超级钢琴

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

  6. Bzoj 2006: [NOI2010]超级钢琴 堆,ST表

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

  7. BZOJ 2006: [NOI2010]超级钢琴( RMQ + 堆 )

    取最大的K个, 用堆和RMQ来加速... ----------------------------------------------------------------- #include<c ...

  8. 【BZOJ 2006】2006: [NOI2010]超级钢琴(RMQ+优先队列)

    2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2792  Solved: 1388 Description 小 ...

  9. 2006: [NOI2010]超级钢琴 - BZOJ

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

随机推荐

  1. BZOJ_day9

    哇,一道巨大的水题害得我wa了无数次... 总结一下教训 大家一定记住(给我自己看的)  位运算 一定要加()!!! 重要的事情说三遍  位运算 一定要加()!!! 位运算 一定要加()!!! 位运算 ...

  2. CVPR2014 Objectness 源码转换(完整版) VS2012 X64 –>win32

    一.版本转换  1.将源码中vs2012 X64版本转换为vs2012 win32版本. 2.源码下载及其相关资料下载http://mmcheng.net/zh/bing/ 3.需要下载源码(Pape ...

  3. Codeforces 937.C Save Energy!

    C. Save Energy! time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  4. POJ3660:Cow Contest(Floyd传递闭包)

    Cow Contest Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16941   Accepted: 9447 题目链接 ...

  5. ShareSDK入门指南:Android 10分钟快速集成

    ShareSDK 官方已提供Android 快速集成教程,以官方教程为参考,本文重点指导大家在集成中遇到的问题. Android 快速集成官方教程:http://wiki.mob.com/Androi ...

  6. python异常之with

    1.基本语法 with expression [as target]: with_body 参数说明: expression:是一个需要执行的表达式: target:是一个变量或者元组,存储的是exp ...

  7. JS中二维数组的声明

    var myarr=new Array(); //先声明一维 for(var i=0;i<2;i++){ //一维长度为2 myarr[i]=new Array(); //再声明二维 for(v ...

  8. jquery学习之事件委派

    一.定义 事件委派的定义就是,把原来加给子元素身上的事件绑定在父元素身上,就是把事件委派给父元素. 二.版本 从jQuery1.7开始,jQuery引入了全新的事件绑定机制,on()和off()两个函 ...

  9. sql数据库的链接方式

    今天看见了一个数据库的链接方法,给转载了,记得我刚刚学DAO的时候老是要记载这些东西,所以就上博客园上面看了看,就转过来了... MySQL: String Driver="com.mysq ...

  10. [bzoj2427][HAOI2010]软件安装——强连通分量+树形DP

    题目大意 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但是 ...