BZOJ-1078: [SCOI2008]斜堆

作者: acccccc | 来源:发表于2019-02-28 14:17 被阅读0次

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

发现某一个子树的序列可以由左右子树合并得到,那么就恶心的分类讨论一下合并的方案即可。

代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
 
using namespace std ;
 
const int maxn = 110 ;
 
int left[ maxn ] , right[ maxn ] , n ; 
 
inline vector < int > dfs( int now ) {
    vector < int > l , r , t ; 
    l.clear(  ) , r.clear(  ) , t.clear(  ) ;
    if ( left[ now ] ) l = dfs( left[ now ] ) ;
    if ( right[ now ] ) r = dfs( right[ now ] ) ;
    if ( ! l.size(  ) && ! r.size(  ) ) {
        t.push_back( now ) ;
    } else if ( ! r.size(  ) ) {
        if ( l.size(  ) > 1 ) {
            t.push_back( now ) ;
            for ( int i = 0 ; i < l.size(  ) ; ++ i ) t.push_back( l.at( i ) ) ;
        } else t.push_back( l.at( 0 ) ) , t.push_back( now ) ;
    } else {
        int i , j ; 
        for ( i = 0 , j = 0 ; i < l.size(  ) && j < r.size(  ) ; ++ i , ++ j ) {
            t.push_back( l.at( i ) ) ; t.push_back( r.at( j ) ) ;
        }
        if ( i < l.size(  ) ) {
            if ( i == l.size(  ) - 1 ) {
                t.push_back( l.at( i ) ) ;
                t.push_back( now ) ;
            } else {
                t.push_back( now ) ;
                for ( ; i < l.size(  ) ; ++ i ) t.push_back( l.at( i ) ) ;
            }
        } else if ( j < r.size(  ) ) {
            t.pop_back(  ) ;
            t.push_back( now ) ;
            for ( -- j ; j < r.size(  ) ; ++ j ) t.push_back( r.at( j ) ) ;
        } else t.push_back( now ) ;
    }
    return t ; 
}
 
int main(  ) {
    memset( left , 0 , sizeof( left ) ) , memset( right , 0 , sizeof( right ) ) ;
    scanf( "%d" , &n ) ;
    for ( int i = 1 ; i <= n ; ++ i ) {
        int d ; scanf( "%d" , &d ) ;
        if ( d >= 100 ) right[ d - 100 ] = i ; else left[ d ] = i ; 
    }
    vector < int > ans = dfs( 0 ) ;
    for ( int i = ans.size(  ) - 1 ; i >= 0 ; -- i ) printf( "%d " , ans.at( i ) ) ;
    printf( "\n" ) ;
    return 0 ; 
}

相关文章

  • BZOJ-1078: [SCOI2008]斜堆

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

  • 左偏树和斜堆

    左偏树的性质 本节点的键值key小于其左右子节点键值key(与二叉堆相同); 本节点的左子节点的距离大于等于本节点...

  • 左式堆、斜堆、二项队列

    左式堆 设计一种堆结构像二叉堆那样高效地支持合并操作(即以 时间处理一次 Merge)而且只使用一个数组似乎很困难...

  • 【数据结构】堆(优先队列):二叉堆、d堆、左式堆、斜堆与二项队列

    这是数据结构类重新复习笔记的第 五 篇,同专题的其他文章可以移步:https://www.jianshu.com/...

  • 学着写诗

    落情 枝头斜日掉,老树落英堆。 此处最惆怅,佳人不领瑰。

  • 斜斜的

    我就那样出神的看着 那幅画,斜斜的挂在墙上。白色的墙面透着些许暖暖的黄意,从画框边四面蔓延,在墙角转折、变暗。 我...

  • 微雨斜斜

    细雨斜斜的织着 与雾有几分相似的,恰恰着 青山隐没,高楼隐隐悄藏 放眼云天 柔柔的交织成一片 浅浅的灰白 雾的...

  • 微雨斜斜

    细雨斜斜的织着 与雾有几分相似的,恰恰着 青山隐没,高楼隐隐悄藏 放眼云天 柔柔的交织成一片 浅浅的灰白 雾的...

  • 奇怪的事情(四)

    [cp]奇怪的事情(四) 永远的四方堆 黄海西,长江北,有一个海滨小镇,角斜镇。角斜镇有一个红旗民兵团,...

  • 《浮生梦》

    映月斜柳风欲摧, 鸦唤几处馒头堆。 山人自语谁人醉, 自古浮生终成灰。

网友评论

    本文标题:BZOJ-1078: [SCOI2008]斜堆

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