[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个音符的美妙度为 ...
随机推荐
- 【NOIP模拟赛】chess 建图+spfa统计方案数
似乎弗洛伊德和迪杰斯特拉都干不了统计方案数,spfa的话就是不断入队就好. #include <cstdio> #include <cstring> #include < ...
- 【NOIP模拟赛】与非 乱搞
biubiu~~~ 正解是线段树维护真值表,但是我觉得对于这道题来说乱搞就够了....... 我们发现如果我们把每一个数都一开始取反就会发现对于最后结果来说 x=x^1,x nand x=x|x ,x ...
- 怎么利用idea自带的工具,不需要 重启tomcat或则其他服务,js代码自动生效
idea中有一个工具:可以直接upload,能让你修改的界面直接可以看到,不需要重启服务. 依次点击的按钮如下: 点击进入的界面这个填的只是一个示例,在各位的电脑上肯定不行,大家依据实际情况填写.
- Terminals Project
https://github.com/Terminals-Origin Terminals Project Terminals is a secure, multi tab terminal serv ...
- PHP 扒一扒这些题目都考了哪些知识点
1.模除 题目: <?php echo -10%3; *结果* -1 分析:其实这道题的知识点是在考模除和正负号的关系,那么我们看一段进阶的代码 <?php echo "10%3 ...
- HDU 1877 又一版 A+B(进制转换)
看了http://lovnet.iteye.com/blog/1690276的答案 好巧妙的方法 递归实现十进制向m进制转换 #include "stdio.h" int m; v ...
- [POI2014] KUR-Couriers(洛谷P3567)
洛谷题目链接:[POI2014]KUR-Couriers 题目描述 Byteasar works for the BAJ company, which sells computer games. Th ...
- angular2框架搭建,angular-cli使用,angular2学习
angular红红火火很多年了,一眨眼ng4都出来了,我也只能叹息前端的日新月异,以及感叹自己永远追赶不上时代的步伐,但是没关系,一个优秀的前端不在于他懂的无数的框架,而在于遇到问题时候懂得如何学习, ...
- Django-内置Admin
Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有: 依赖APP: django.contrib.auth django.contrib.contenttyp ...
- java字节流和字符流编码格式(转自姚刚)
/** * 字节流和字符流的区别, * (1)字符流带有缓冲,必须flush或close后数据才会从缓存中写入磁盘文件. * 字节流直接写文件. * (2)字符流在创建流的时候,指定编码,字节流在文件 ...