BZOJ 3224: Tyvj 1728 普通平衡樹 題解

題目:http://www.lydsy.com/JudgeOnline/problem.php?id=3224

思路:裸平衡樹弧腥,直接模擬即可驮审。

代碼(SBT):

#include <cstdio>

#include <algorithm>

#include <cstdlib>

 

using namespace std;

 

struct node {

    node *left,*right;

    int key,s;

};

 

node *roof,*bank=new(node);

 

int n;

 

int left_ratote(node* &t){

    node *k=(*t).right;

    (*t).right=(*k).left;

    (*t).s=(*(*t).left).s+(*(*t).right).s+1;

    (*k).left=t;

    (*k).s=(*t).s+(*(*k).right).s+1;

    t=k;

    return 0;

}

 

int right_ratote(node* &t){

    node *k=(*t).left;

    (*t).left=(*k).right;

    (*t).s=(*(*t).left).s+(*(*t).right).s+1;

    (*k).right=t;

    (*k).s=(*(*k).left).s+(*t).s+1;

    t=k;

    return 0;

}

 

int maintain(node* &t){

    if ((*(*(*t).left).left).s>(*(*t).right).s){

        right_ratote(t);

        maintain((*t).right);

        maintain(t);

        return 0;

    }

    if ((*(*(*t).left).right).s>(*(*t).right).s){

        left_ratote((*t).left);

        right_ratote(t);

        maintain((*t).left);

        maintain((*t).right);

        maintain(t);

        return 0;

    }

    if ((*(*(*t).right).right).s>(*(*t).left).s){

        left_ratote(t);

        maintain((*t).left);

        maintain(t);

        return 0;

    }

    if ((*(*(*t).right).left).s>(*(*t).left).s){

        right_ratote((*t).right);

        left_ratote(t);

        maintain((*t).left);

        maintain((*t).right);

        maintain(t);

        return 0;

    }

    return 0;

}

 

int INSERT(int key,node* &t){

    if (t==bank){

        t=new(node);

        (*t).key=key;

        (*t).s=1;

        (*t).left=(*t).right=bank;

        return 0;

    }

    (*t).s++;

    if (key<=(*t).key){

        INSERT(key,(*t).left);

    } else INSERT(key,(*t).right);

    maintain(t);

    return 0;

}

 

int DELETE(int key,node* &t){

    if (key==(*t).key){

        if ((*t).left==bank){

            if ((*t).right==bank){

                delete(t);

                t=bank;

                return 0;

            } else {

                node *p=(*t).right;

                delete(t);

                t=p;

                return 0;

            }

        } else {

            if ((*t).right==bank){

                node *p=(*t).left;

                delete(t);

                t=p;

                return 0;

            }

        }

        if (rand()%2){

            left_ratote(t);

            DELETE(key,(*t).left);

        } else {

            right_ratote(t);

            DELETE(key,(*t).right);

        }

    } else {

        if (key<(*t).key){

            DELETE(key,(*t).left);

        } else DELETE(key,(*t).right);

    }

    (*t).s=(*(*t).left).s+(*(*t).right).s+1;

    maintain(t);

    return 0;

}

 

int get_rank(int key,node *t){

    int rec=0;

    node *p=t;

    while (p!=bank){

        if ((*p).key<key){

            rec+=((*(*p).left).s+1);

            p=(*p).right;

        } else {

            p=(*p).left;

        }

    }

    return rec;

}

 

int get_num(int key,node *t){

    if ((key-1)==(*(*t).left).s){

        return (*t).key;

    }

    if ((key-1)<(*(*t).left).s){

        return get_num(key,(*t).left);

    } else {

        return get_num(key-(*(*t).left).s-1,(*t).right);

    }

}

 

int get_prefix(int key,node *t){

    if (t==bank){

        return -0x7fffffff;

    }

    if ((*t).key<key){

        return max((*t).key,get_prefix(key,(*t).right));

    } else {

        return get_prefix(key,(*t).left);

    }

}

 

int get_suffix(int key,node *t){

    if (t==bank){

        return 0x7fffffff;

    }

    if (key<(*t).key){

        return min((*t).key,get_suffix(key,(*t).left));

    } else {

        return get_suffix(key,(*t).right);

    }

}

 

int main(){

    srand(0);

    roof=(*bank).left=(*bank).right=bank;

    (*bank).s=0;

    scanf("%d",&n);

    while (n--){

        int x,y;

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

        switch (x){

            case 1:

                INSERT(y,roof);

                break;

            case 2:

                DELETE(y,roof);

                break;

            case 3:

                printf("%d\n",get_rank(y,roof)+1);

                break;

            case 4:

                printf("%d\n",get_num(y,roof));

                break;

            case 5:

                printf("%d\n",get_prefix(y,roof));

                break;

            case 6:

                printf("%d\n",get_suffix(y,roof));

                break;

        }

    }

    return 0;

}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末雳旅,一起剝皮案震驚了整個濱河市鼻由,隨后出現(xiàn)的幾起案子省骂,更是在濱河造成了極大的恐慌惊橱,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宝踪,死亡現(xiàn)場離奇詭異侨糟,居然都是意外死亡,警方通過查閱死者的電腦和手機瘩燥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門秕重,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人厉膀,你說我怎么就攤上這事溶耘《眨” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵凳兵,是天一觀的道長百新。 經(jīng)常有香客問我,道長庐扫,這世上最難降的妖魔是什么饭望? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮形庭,結(jié)果婚禮上铅辞,老公的妹妹穿的比我還像新娘。我一直安慰自己萨醒,他們只是感情好斟珊,可當(dāng)我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著富纸,像睡著了一般倍宾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上胜嗓,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天,我揣著相機與錄音钩乍,去河邊找鬼辞州。 笑死,一個胖子當(dāng)著我的面吹牛寥粹,可吹牛的內(nèi)容都是我干的变过。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼涝涤,長吁一口氣:“原來是場噩夢啊……” “哼媚狰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起阔拳,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤崭孤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后糊肠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辨宠,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年货裹,在試婚紗的時候發(fā)現(xiàn)自己被綠了嗤形。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡弧圆,死狀恐怖赋兵,靈堂內(nèi)的尸體忽然破棺而出笔咽,到底是詐尸還是另有隱情,我是刑警寧澤霹期,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布叶组,位于F島的核電站,受9級特大地震影響经伙,放射性物質(zhì)發(fā)生泄漏扶叉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一帕膜、第九天 我趴在偏房一處隱蔽的房頂上張望枣氧。 院中可真熱鬧,春花似錦垮刹、人聲如沸达吞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽酪劫。三九已至,卻和暖如春寺董,著一層夾襖步出監(jiān)牢的瞬間覆糟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工遮咖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留滩字,地道東北人。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓御吞,卻偏偏與公主長得像麦箍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子陶珠,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,331評論 25 707
  • 雜念 黑夜挟裂,無眠的眼睛在歌里 淡然地凝望 那是一張張破碎的網(wǎng)——紛紛擾擾 只是多了一份按耐不住的可笑 怯懦的我請你...
    良人兒2閱讀 146評論 0 0