[BZOJ 2006] 超级钢琴
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] 超级钢琴的更多相关文章
- BZOJ 2006 超级钢琴(划分树+优先队列)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2006 题意: 给出一个数列A,L,R,构造出一个新的集合,集合中的数字为A中任意连续t( ...
- bzoj 2006 超级钢琴 —— ST表
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2006 本来应该是可以用主席树,找区间最小值,取出来后再找那段区间的次小值...... 但也可 ...
- BZOJ 2006 超级钢琴(堆+主席树)
很好的一道题. 题意:给出长度为n的数列,选择k个互不相同的区间,满足每个区间长度在[L,R]内,求所有选择的区间和的总和最大是多少.(n,k<=5e5). 首先将区间和转化为前缀和之差,那么我 ...
- [BZOJ 2006] [NOI 2010]超级钢琴(贪心+ST表+堆)
[BZOJ 2006] [NOI 2010]超级钢琴(贪心+ST表+堆) 题面 给出一个长度为n的序列,选k段长度在L到R之间的区间,一个区间的值等于区间内所有元素之的和,使得k个区间的值之和最大.区 ...
- BZOJ 2006: [NOI2010]超级钢琴
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2613 Solved: 1297[Submit][Statu ...
- Bzoj 2006: [NOI2010]超级钢琴 堆,ST表
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2222 Solved: 1082[Submit][Statu ...
- BZOJ 2006: [NOI2010]超级钢琴( RMQ + 堆 )
取最大的K个, 用堆和RMQ来加速... ----------------------------------------------------------------- #include<c ...
- 【BZOJ 2006】2006: [NOI2010]超级钢琴(RMQ+优先队列)
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2792 Solved: 1388 Description 小 ...
- 2006: [NOI2010]超级钢琴 - BZOJ
Description小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为 ...
随机推荐
- elk,centos7,filebeat,elasticsearch-head详细安装步骤
先来张图,大致结构应该晓得,对吧! 安装jdk:至少1.8以上 yum -y localinstall jdk-8u73-linux-x64.rpm 安装elasticsearch5.2.1 用普通用 ...
- javascript中top、clientTop、scrollTop、offsetTop的讲解
下面结合各上图介绍一下各个属性的作用: 一.offsetTop属性: 此属性可以获取元素的上外缘距离最近采用定位父元素内壁的距离,如果父元素中没有采用定位的,则是获取上外边缘距离文档内壁的距离.所谓的 ...
- bzoj4756 [Usaco2017 Jan]Promotion Counting
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4756 [题解] dsu on tree,树状数组直接上 O(nlog^2n) # inclu ...
- ACdream 1113 The Arrow (概率dp求期望)
E - The Arrow Time Limit:1000MS Memory Limit:64000KB 64bit IO Format:%lld & %llu Submit ...
- 【洛谷 P3469】[POI2008]BLO-Blockade(割点)
题目链接 题意:一个无向联通图,求删去每个点及其所有边后有多少有序点对的连通性发生了变化. Tarjan求割点的例题.. 如果当前点不是割点,那么它对整个图的连通性不产生影响,只有自己与其他\(n-1 ...
- bzoj 1001 平面图转对偶图 最短路求图最小割
原题传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1001 整理了下之前A的题 平面图可以转化成对偶图,然后(NlogN)的可以求出图的最小割( ...
- dj定时任务
参考:http://www.mknight.cn/post/13/ https://blog.csdn.net/sicofield/article/details/50937338 一.INSTALL ...
- js 触发LinkButton点击事件,执行后台方法
页面 <asp:LinkButton ID="lbtButton" runat="server" CssClass="lbtButton&qu ...
- 聊聊C++模板函数与非模板函数的重载
前言 函数重载在C++中是一个很重要的特性.之所以有了它才有了操作符重载.iostream.函数子.函数适配器.智能指针等非常有用的东西. 平常在实际的应用中多半要么是模板函数与模板函数重载,或者是非 ...
- 关于oracle的连接时ORA-12519错误的解决方案
系统在运行时出现了ORA-12519的错误,无法连接数据库,后来在网上找了下,找到了如下的解决方法,共享下. OERR: ORA-12519 TNS:no appropriate service ha ...