BZOJ-2333: [SCOI2011]棘手的操作(splay+set)

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

刚开始看到是动态图问题吓晕了,后来发现没有删边操作,那么就好办多了:由于只需要合并,不需要拆开,所以直接splay暴力维护即可,对于全体最值,本来想打个堆维护的,不过犯了懒,就直接multiset水过去了~

代码(很慢很慢。。。Splay+STL 常数异常巨大):

0823dd54564e9258a08582929e82d158ccbf4e1c.jpg.png
#include <cstdio>

#include <algorithm>

#include <cstring>

#include <set>

 

using namespace std ;

 

#define MAXN 300010

#define L( t ) left[ t ]

#define R( t ) right[ t ]

#define F( t ) father[ t ]

#define G( t )F(F( t ))

#define M( t ) Max[ t ]

#define V( t ) value[ t ]

#define S( t ) sign[ t ]

#define C( t )( t ==L(F( t )))

#define clear( t )memset( t ,0,sizeof( t ))

#define inf 0x7fffffff

 

multiset <int> S ;

 

int left[ MAXN ], right[ MAXN ], father[ MAXN ], Max[ MAXN ], value[ MAXN ], sign[ MAXN ];

int n , m ;

 

void pushdown(int t ){

    if( t &&S( t )){

        V( t )+=S( t ),M( t )+=S( t );

        S(L( t ))+=S( t ),S(R( t ))+=S( t );

        S( t )=0;

    }

}

 

void update(int t ){

    pushdown( t );pushdown(L( t )),pushdown(R( t ));

    M( t )=max(V( t ),max(M(L( t )),M(R( t ))));

}

 

void zag(int t ){

    pushdown( t );pushdown(R( t ));

    int k =R( t ), u =F( t );bool flag =C( t );

    F(R( t )=L( k ))= t ;update( t );

    F(L( k )= t )= k ;update( k );

    F( k )= u ;if( u )if( flag )L( u )= k ;else R( u )= k ;

}

 

void zig(int t ){

    pushdown( t );pushdown(L( t ));

    int k =L( t ), u =F( t );bool flag =C( t );

    F(L( t )=R( k ))= t ;update( t );

    F(R( k )= t )= k ;update( k );

    F( k )= u ;if( u )if( flag )L( u )= k ;else R( u )= k ;

}

 

void splay(int t ){

    while(F( t )){

        pushdown(G( t )),pushdown(F( t )),pushdown( t );

        if(!G( t ))if(C( t ))zig(F( t ));else zag(F( t ));else{

            if(C( t )){

                if(C(F( t )))zig(G( t ));zig(F( t ));

            }else{

                if(!C(F( t )))zag(G( t ));zag(F( t ));

            }

        }

    }

}

 

int MIN(int t ){

    for(;L( t ); t =L( t ));return t ;

}

 

int MAX(int t ){

    for(;R( t ); t =R( t ));return t ;

}

 

int roof(int t ){

    splay( t );return MIN( t );

}

 

int delta =0;

 

int main(  ){

    clear( left ),clear( right ),clear( father ),clear( Max ),clear( value ),clear( sign );

    Max[0]= value[0]=- inf ;

    scanf("%d",&n );

    for(int i =0; i ++< n ;){

        scanf("%d",&value[ i ]);

        Max[ i ]= value[ i ], S.insert( value[ i ]);

    }

    scanf("%d",&m );

    while( m --){

        char s[10];scanf("%s", s );

        int x , y , u , v ;

        if( s[0]=='U'){

            scanf("%d%d",&x ,&y );

            if(roof( x )!=roof( y )){

                splay( x ),splay( y );

                pushdown( x ),pushdown( y );

                if(M( x )<M( y )){

                    S.erase( S.find(M( x )));

                    splay( u =MIN( y ));pushdown( u );

                    F(L( u )= x )= u ;

                }else{

                    S.erase( S.find(M( y )));

                    splay( u =MAX( x ));pushdown( u );

                    F(R( u )= y )= u ;

                }

            }

        }else if( s[0]=='A'){

            if( s[1]=='1'){

                scanf("%d%d",&x ,&v );

                splay( x );pushdown( x );

                int u =M( x );

                V( x )+= v ;update( x );

                if(M( x )!= u ){

                    S.erase( S.find( u ));

                    S.insert(M( x ));

                }

            }else if( s[1]=='2'){

                scanf("%d%d",&x ,&v );

                splay( x );pushdown( x );

                S.erase( S.find(M( x )));

                S( x )= v ;pushdown( x );

                S.insert(M( x ));

            }else if( s[1]=='3'){

                scanf("%d",&v ); delta += v ;

            }

        }else if( s[0]=='F'){

            if( s[1]=='1'){

                scanf("%d"  ,&x );

                splay( x );pushdown( x );

                printf("%d\n",V( x )+ delta );

            }else if( s[1]=='2'){

                scanf("%d",&x );

                splay( x );pushdown( x );

                printf("%d\n",M( x )+ delta );

            }else if( s[1]=='3'){

                printf("%d\n",*(-- S.end(  ))+ delta );

            }

        }

    }

    return 0;

}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容

  • STL部分 1.STL为什么广泛被使用 C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vec...
    杰伦哎呦哎呦阅读 4,317评论 0 9
  • STL与泛型编程一、STL是什么STL(Standard TemplateLibrary),即标准模板库,是一个具...
    amberfjx阅读 175评论 0 0
  • 一、C语言基础 1、struct 的内存对齐和填充问题其实只要记住一个概念和三个原则就可以了: 一个概念:自然对齐...
    XDgbh阅读 2,206评论 1 38
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,973评论 25 707
  • 日前看到一篇文章,大概是说为什么在中国历史上没有单身狗。在中国历史上真的没有单身狗吗?答案显然是否定的。别的朝代暂...
    至简君阅读 1,722评论 12 12