设计一个五元组(i,l,r,p,v),表示在以i为左端点,右端点落在(l,r)中的情况下,取最大值v时右端点落在p。把这个五元组塞到优先队列里,以v排序,每次取出一个,然后把这个取过的五元组分成两个(i,l,p-1,p',v')(i,p+1,r,p'',v'')塞回去。

关于如何确定v和p,先求前缀和s,然后选择st表,注意这里的st表存的是位置,s[i][0]=i,然后取max的操作改成mx:return s[a]>s[b]?a:b;就可以了,不用存两个(我因为存了两个WAWAWA…然而至今不知道为啥

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int N=550005;
int n,m,l,r,a[N],st[N][20],b[N],s[N];
long long ans;
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
struct qwe
{
int i,l,r,v,p;
bool operator < (const qwe &a) const
{
return v<a.v;
}
};
priority_queue<qwe>q;
int mx(int a,int b)
{
return s[a]>s[b]?a:b;
}
void add(int i,int l,int r)
{
qwe now;
now.i=i,now.l=l,now.r=min(r,n);
if(now.l>now.r)
return;
int k=b[now.r-now.l+1];
now.p=mx(st[now.l][k],st[now.r-(1<<k)+1][k]);
now.v=s[now.p]-s[now.i-1];//cout<<now.i<<" "<<now.l<<" "<<now.r<<" "<<now.p<<" "<<now.v<<endl;
q.push(now);
}
int main()
{
n=read(),m=read(),l=read(),r=read();
for(int i=1;i<=n;i++)
{
a[i]=read();
s[i]=s[i-1]+a[i];
st[i][0]=i;
}
b[1]=0;
for(int i=2;i<=n;i++)
b[i]=b[i>>1]+1;
for(int j=1;(1<<j)<=n;j++)
for(int i=1;i+(1<<j)-1<=n;i++)
st[i][j]=mx(st[i][j-1],st[i+(1<<j-1)][j-1]);
for(int i=1;i<=min(n,n-l+1);i++)
add(i,i+l-1,i+r-1);
for(int i=1;i<=m;i++)
{
qwe now=q.top();
q.pop();//cout<<now.i<<" "<<now.l<<" "<<now.r<<" "<<now.p<<" "<<now.v<<endl;
ans+=now.v;
add(now.i,now.l,now.p-1);
add(now.i,now.p+1,now.r);
}
printf("%lld\n",ans);
return 0;
}

bzoj 2006: [NOI2010]超级钢琴【st表+堆】的更多相关文章

  1. BZOJ 2006: [NOI2010]超级钢琴 ST表+堆

    开始想到了一个二分+主席树的 $O(n\log^2 n)$ 的做法. 能过,但是太无脑了. 看了一下题解,有一个 ST 表+堆的优美解法. 你发现肯定是选取前 k 大最优. 然后第一次选的话直接选固定 ...

  2. bzoj 2006 [NOI2010]超级钢琴——ST表+堆

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2006 每个右端点的左端点在一个区间内:用堆记录端点位置.可选区间,按价值排序:拿出一个后也许 ...

  3. BZOJ 2006: [NOI2010]超级钢琴 [ST表+堆 | 主席树]

    题意: 一个序列,求k个不相同的长度属于\([L,R]\)的区间使得和最大 前缀和,对于每个r找最小的a[l] 然后我yy了一个可持久化线段树做法...也许会T 实际上主席树就可以了,区间k小值 然后 ...

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

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

  5. 【BZOJ2006】[NOI2010]超级钢琴 ST表+堆

    [BZOJ2006][NOI2010]超级钢琴 Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以 ...

  6. BZOJ 2006 NOI2010 超级钢琴 划分树+堆

    题目大意:给定一个序列.找到k个长度在[l,r]之间的序列.使得和最大 暴力O(n^2logn),肯定过不去 看到这题的第一眼我OTZ了一下午... 后来研究了非常久别人的题解才弄明确怎么回事...蒟 ...

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

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

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

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

  9. 【BZOJ-2006】超级钢琴 ST表 + 堆 (一类经典问题)

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

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

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

随机推荐

  1. Swift--Set的了解

    1. 创建和初始化一个空的set var letters = Set<Character>() 或者,如果上下文已经提供了类型信息,例如函数参数或已输入的变量或常量,则可以创建空的集合,其 ...

  2. (二)Commonjs规范与模块化

    在之前的学习中我们使用require()来引入我们需要的包,这其实就是模块化,各模块相互独立,可以通过某种方式引入别的模块.而这些引入方式都是遵循一定的规范的,这就是CommonJS规范. 一.Com ...

  3. 一个开发的Linux使用心得总结

    Liunx介绍 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX工具软件.应用程序和网络协 ...

  4. Substrings--poj1226(字符串)

    Description You are given a number of case-sensitive strings of alphabetic characters, find the larg ...

  5. java代码 猜数字小游戏

    import java.util.Scanner; import java.util.Random; public class mulTip{ public static void main(Stri ...

  6. Spring Boot中使用logback日志框架

    说明:Spring Boot在最新的版本中默认使用了logback框架.一般来说使用时只需在classpath下创建logback.xml即可,而官方推荐使用logback-spring.xml替代, ...

  7. Spring基于Java的JSR-250注解

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/annotation-based-configuration/spring-jsr250-annot ...

  8. Go---设计模式(策略模式)

    策略模式定义了算法家族,在调用算法家族的时候不感知算法的变化,客户也不会受到影响. 下面用<大话设计模式>中的一个实例进行改写. 例:超市中经常进行促销活动,促销活动的促销方法就是一个个策 ...

  9. linux迁移至固态硬盘全过程

    自从台式机上用上固态硬盘后,就再也受不了笔记本上的5400转的机械硬盘了,所以这次又买了块固态硬盘打算装到笔记本上. 笔记本里装的是Ubuntu 14.04 + Win7双系统,Win7主要偶尔运行一 ...

  10. [Angular] Refactor Angular Component State Logic into Directives

    Allow the base toggle to be a tag (<toggle>) or attribute (<div toggle>). The <toggle ...