【bzoj2006】NOI2010超级钢琴

补了下前置技能……

题意就是求一段区间的权值和前k大的子序列的和。

把段扔进优先队列

每次拿出来之后按照所选择的j进行分裂

#include<bits/stdc++.h>
#define N 500005
#define mp(a,b,c,d) (seg){a,b,c,d}
using namespace std;
typedef long long ll;
struct seg{int i,l,r,t;};
int bin[20],Log[N],n,k,l,r,a[N],st[20][N];
ll ans=0;
void initrmq(){
    Log[0]=-1;for(int i=1;i<=n;i++)Log[i]=Log[i>>1]+1;
    for(int i=1;i<=n;i++)st[0][i]=i;
    for(int i=n;i;i--)for(int j=1;j<=18;j++)
    if(i+bin[j]-1<=n){
        int t1=st[j-1][i],t2=st[j-1][i+bin[j-1]];
        st[j][i]=a[t1]>a[t2]?t1:t2;
    }
    else break;
}
inline int query(int l,int r){
    if(l==r)return l;int t=Log[r-l+1];
    int t1=st[t][l],t2=st[t][r-bin[t]+1];
    return a[t1]>a[t2]?t1:t2;
}
inline bool operator <(seg x,seg y){
    return a[x.t]-a[x.i-1]<a[y.t]-a[y.i-1];
}
inline int read(){
    int f=1,x=0;char ch;
    do{ch=getchar();if(ch==‘-‘)f=-1;}while(ch<‘0‘||ch>‘9‘);
    do{x=x*10+ch-‘0‘;ch=getchar();}while(ch>=‘0‘&&ch<=‘9‘);
    return f*x;
}
int main(){
    bin[0]=1;for(int i=1;i<=20;i++)bin[i]=bin[i-1]<<1;
    n=read();k=read();l=read();r=read();
    for(int i=1;i<=n;i++)a[i]=read()+a[i-1];
    initrmq();
    priority_queue<seg,vector<seg> >q;
    for(int i=1;i<=n;i++)if(i+l-1<=n){
        int t=min(n,i+r-1);q.push(mp(i,i+l-1,t,query(i+l-1,t)));
    }
    for(int i=1;i<=k;i++){
        seg t=q.top();q.pop();
        ans+=a[t.t]-a[t.i-1];
        if(t.t-1>=t.l)q.push(mp(t.i,t.l,t.t-1,query(t.l,t.t-1)));
        if(t.t+1<=t.r)q.push(mp(t.i,t.t+1,t.r,query(t.t+1,t.r)));
    }
    cout<<ans<<endl;
}
时间: 2024-10-27 07:56:12

【bzoj2006】NOI2010超级钢琴的相关文章

[BZOJ2006] [NOI2010]超级钢琴 主席树+贪心+优先队列

2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 3591  Solved: 1780[Submit][Status][Discuss] Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的 音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中Ai可正可负. 一个"超级 和弦"由若干个编号连续的

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

2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 3679  Solved: 1828[Submit][Status][Discuss] Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的 音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中Ai可正可负. 一个“超级 和弦”由若干个编号连续的音符组成,

bzoj2006 noi2010 超级钢琴 主席树 + 优先队列

Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2435  Solved: 1195 Description 小 Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中Ai可正可负. 一个“超级和弦”由若干个编号连续的音符组成,包含的音符个数不少于L且不多于R.我们定义超级和弦的美妙度为其包含的所有音符的美妙度之和.两

bzoj2006 [NOI2010]超级钢琴 [优先队列|RMQ]

Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中Ai可正可负. 一个"超级和弦"由若干个编号连续的音符组成,包含的音符个数不少于L且不多于R.我们定义超级和弦的美妙度为其包含的所有音符的美妙度之和.两个超级和弦被认为是相同的,当且仅当这两个超级和弦所包含的音符集合是相同的. 小Z决定创作一首由k个超级和弦组成的乐曲,为了使得

bzoj2006 [NOI2010]超级钢琴

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2006 [题解] 思路巧妙啊! 前置技能:序列和可以转化成前缀和的形式,那么前缀和左端点固定了右端点就是区间找最大值了. 记录五元组(from, l, r, pos, val)表示从from开始,右端点在[l,r]之间,在pos处取max,取max的值是val. 那么按照val扔到堆里,每次取出最大的,从pos分裂成两半,要兹磁求最大值,所以st表就行了. # include <queue>

[luogu2048] [bzoj2006] [NOI2010] 超级钢琴 题解

花了一个星期,总算把这一道该死的毒瘤题做完了. 这道题有很多种解法,我是用优先队列+主席树. 首先每一个区间的和,可以表示为两个前缀和之差. 我们显然可以知道,每一次找到的那个最大值必然在以一个点为最后一个点的区间之内. 所以我们可以把每一个点为最后一个点的最大值的区间求出来,先打入队列. 然后每一次打出来一个值,我们就把这个区间的最后一个值的位置的排名前一名的那一个区间打入队列. 这样重复计算即可. 至于实现,我们可以将每一个前缀和建一个主席树,然后我们维护一个三元组(add,cnt,end)

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

[BZOJ2006][NOI2010]超级钢琴 Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中Ai可正可负. 一个“超级和弦”由若干个编号连续的音符组成,包含的音符个数不少于L且不多于R.我们定义超级和弦的美妙度为其包含的所有音符的美妙度之和.两个超级和弦被认为是相同的,当且仅当这两个超级和弦所包含的音符集合是相同的. 小Z决定创作

bzoj2006[NOI2016]超级钢琴

bzoj2006[NOI2016]超级钢琴 题意: 超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中Ai可正可负.一个“超级和弦”由若干个编号连续的音符组成,包含的音符个数不少于L且不多于R,其美妙度为包含的所有音符的美妙度之和.两个超级和弦被认为是相同的,当且仅当这两个超级和弦所包含的音符集合是相同的.现需创作一首由k个不同的超级和弦组成的乐曲.定义一首乐曲的美妙度为其所包含的所有超级和弦的美妙度之和.求能够创作出来的乐曲美妙度最大值是多少. 题解: 乍一看很难,实际上

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

2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2222  Solved: 1082[Submit][Status][Discuss] Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中Ai可正可负. 一个“超级和弦”由若干个编号连续的音符组成,包含

BZOJ 2006: [NOI2010]超级钢琴

2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2613  Solved: 1297[Submit][Status][Discuss] Description 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的 音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中Ai可正可负. 一个“超级 和弦”由若干个编号连续的音符组成,