BZOJ-2006: [NOI2010]超级钢琴

作者: AmadeusChan | 来源:发表于2018-10-17 12:13 被阅读0次

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2006

刚开始搞错了题意,以为每个和弦里的美妙度集合要不同。。。傻了半天终于理解了,1Y

代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
 
using namespace std ;
 
#define MAXN 500100
#define MAXD 24
#define rep( i , x ) for ( int i = 0 ; i ++ < x ; )
#define ll long long
 
int a[ MAXN ] , n , k , pre[ MAXN ] , st[ MAXN ][ MAXD ] , D , L , R ;
int pos[ MAXN ][ MAXD ] ;
 
int Min( int l , int r ) {
    int d = int( log2( r - l + 1 ) ) ;
    return min( st[ l ][ d ] , st[ r - ( 1 << d ) + 1 ][ d ] ) ;
}
 
int Pos( int l , int r ) {
    int d = int( log2( r - l + 1 ) ) ;
    if ( st[ l ][ d ] < st[ r - ( 1 << d ) + 1 ][ d ] ) {
        return pos[ l ][ d ] ; 
    } else return pos[ r - ( 1 << d ) + 1 ][ d ] ;
}
 
struct node {
    int l , r , x ;
    ll v ;
    node( int _l , int _r , int _x ) : l( _l ) , r( _r ) , x( _x ) , v( pre[ _x ] - Min( _l , _r ) ) {
         
    }
    bool operator < ( const node &a ) const {
        return v < a.v ;
    }
};
priority_queue < node > q ;
 
void Init(  ) {
    scanf( "%d%d%d%d" , &n , &k , &L , &R ) ;
    rep( i , n ) scanf( "%d" , &a[ i ] ) ;
    pre[ 0 ] = 0 ;
    rep( i , n ) pre[ i ] = pre[ i - 1 ] + a[ i ] ;
    D = int( log2( n ) ) + 1 ;
    for ( int i = 0 ; i <= n ; ++ i ) {
        st[ i ][ 0 ] = pre[ i ] , pos[ i ][ 0 ] = i ;
    }
    rep( i , D ) {
        for ( int j = 0 ; j <= n ; ++ j ) {
            if ( st[ j ][ i - 1 ] < st[ j + ( 1 << ( i - 1 ) ) ][ i - 1 ] ) {
                st[ j ][ i ] = st[ j ][ i - 1 ] , pos[ j ][ i ] = pos[ j ][ i - 1 ] ;
            } else {
                st[ j ][ i ] = st[ j + ( 1 << ( i - 1 ) ) ][ i - 1 ] ;
                pos[ j ][ i ] = pos[ j + ( 1 << ( i - 1 ) ) ][ i - 1 ] ;
            }
        }
    }
    while ( ! q.empty(  ) ) q.pop(  ) ;
    for ( int i = 0 ; i ++ < n ; ) {
        int l = max( 0 , i - R ) , r = i - L ;
        if ( r < 0 ) continue ;
        q.push( node( l , r , i ) ) ;
    }
}
 
void Solve(  ) {
    ll ans = 0 ;
    while ( k -- ) {
        node ret = q.top(  ) ; q.pop(  ) ;
        ans += ret.v ;
        int p = Pos( ret.l , ret.r ) ;
        if ( ret.l < p ) q.push( node( ret.l , p - 1 , ret.x ) ) ;
        if ( ret.r > p ) q.push( node( p + 1 , ret.r , ret.x ) ) ;
    }
    printf( "%lld\n" , ans ) ;
}
 
int main(  ) {
    Init(  ) ;
    Solve(  ) ;
    return 0 ;
}

相关文章

  • BZOJ-2006: [NOI2010]超级钢琴

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2006 刚...

  • 仍然不直播,但继续拍弹唱

    封控在家的日子录了首《上海滩》的钢琴即兴版,家里这台钢琴琴键是超级重锤的,比市面上百分之七十的钢琴弹起来都...

  • 周一

    钢琴老师说,我家老大记忆力超级好,弹一次就都记住了~ 我表示:啊? 能记住琴谱,英文背书也超级简单,为...

  • 0036:山叶钢琴,学钢琴的孩子不会变坏

    【每天一句话】 0036:山叶钢琴,学钢琴的孩子不会变坏 【解码】 1,这句广告学挺喜欢的,也是台湾超级经典广告语...

  • 钢琴梦想

    今天我在家里用小琴谈合唱团的曲子,妈妈说你真的喜欢吗如果喜欢给你买个钢琴吧。 我超级开心 我真的想有个钢琴,因为在...

  • 2020-06-09吸引到优秀钢琴教师,从此我再也不用担心儿子的

    宇宙爸爸实力宠我,给我的儿子安排了一个超级无敌好的钢琴教师,从此以后,我都不需要再担心儿子的钢琴学习啦。 儿子学习...

  • 秋日私语

    超级喜欢法国钢琴家理查德·克莱德曼的钢琴曲《秋日私语》。每当夜深人静,我要写作时,那些静静流淌的音符,仿佛跳跃在静...

  • 秋日私语

    超级喜欢法国钢琴家理查德·克莱德曼的钢琴曲《秋日私语》。每当夜深人静,我要写作时,那些静静流淌的音符,仿佛跳跃在静...

  • 左撇子

    Hi, This is me. 来自GZ 大一女孩 爱好打篮球 弹钢琴(音乐) 涂鸦 玩 吃 超级爱狗狗 乐交友...

  • 零基础学习钢琴的超级建议

    曼曼最近在写钢琴教程,对钢琴学习进行了系统整理,结合近十年来的教琴和钢琴比赛评委经验,和大家分享学琴的心得体会,无...

网友评论

    本文标题:BZOJ-2006: [NOI2010]超级钢琴

    本文链接:https://www.haomeiwen.com/subject/lmglzftx.html