LUOGU 3377 左偏樹(shù)

Description

如題,一開(kāi)始有N個(gè)小根堆娩践,每個(gè)堆包含且僅包含一個(gè)數(shù)。接下來(lái)需要支持兩種操作:
操作1 1 x y 將第x個(gè)數(shù)和第y個(gè)數(shù)所在的小根堆合并(若第x或第y個(gè)數(shù)已經(jīng)被刪除或第x和第y個(gè)數(shù)在用一個(gè)堆內(nèi)烹骨,則無(wú)視此操作)
操作2 2 x 輸出第x個(gè)數(shù)所在的堆最小數(shù)翻伺,并將其刪除(若第x個(gè)數(shù)已經(jīng)被刪除,則輸出-1并無(wú)視刪除操作)

Input Format

第一行包含兩個(gè)正整數(shù)N,M沮焕,分別表示一開(kāi)始小根堆的個(gè)數(shù)和接下來(lái)操作的個(gè)數(shù)吨岭。
第二行包含N個(gè)正整數(shù),其中第i個(gè)正整數(shù)表示第i個(gè)小根堆初始時(shí)包含且僅包含的數(shù)峦树。
接下來(lái)M行每行2個(gè)或3個(gè)正整數(shù)辣辫,表示一條操作簿废,格式如下:
操作1 1 x y
操作2 2 x

Output Format

輸出包含若干行整數(shù),分別依次對(duì)應(yīng)每一個(gè)操作2所得的結(jié)果络它。

Sample Input

5 5
1 5 4 2 3
1 1 5
1 2 5
2 2
1 4 2
2 2

Sample Output

1
2

Constraints

對(duì)于100%的數(shù)據(jù):N \leq 100000族檬,M \leq 100000

CCYOS

這是一道左偏樹(shù)板子題。感謝徐灝誠(chéng)juju的講課化戳,挺好理解的单料。

  1. 左偏樹(shù)
    可并堆的一種,有如下性質(zhì):
    a.堆性質(zhì)
    保證每顆子樹(shù)的根節(jié)點(diǎn)的權(quán)值小于它的左兒子和右兒子的權(quán)值点楼,這樣可以O(1)刪除本堆中的最小節(jié)點(diǎn)扫尖。
    b.左偏性質(zhì)
    定義有一顆子樹(shù)為空的節(jié)點(diǎn)為外節(jié)點(diǎn)
    定義每個(gè)點(diǎn)的dist為這個(gè)點(diǎn)到它的后代中的外節(jié)點(diǎn)的最短距離掠廓。
    左偏樹(shù)滿足dist[rs] \leq dist[ls]但是這并不代表左偏樹(shù)左子樹(shù)比右子樹(shù)深度大
    所以有dist[x] = dist[ls] + 1不可能會(huì)出現(xiàn)單右子樹(shù)的情況换怖,所以令dist[0] = -1來(lái)使下圖的根(外節(jié)點(diǎn))的dist正確。
    權(quán)值為5的節(jié)點(diǎn)的dist為0

2)左偏樹(shù)的合并
設(shè)有兩棵左偏樹(shù)A,B需要合并蟀瞧。
左偏樹(shù)的合并是努力讓B和A的右子樹(shù)合并沉颂,簡(jiǎn)稱把我的兄弟(?)變成我的兒子悦污,同時(shí)要維護(hù)左偏樹(shù)的性質(zhì)铸屉。
a.有一棵樹(shù)為空:直接返回該子樹(shù)。

if(!x||!y)return x + y;

b.沒(méi)有空子樹(shù):
為了維護(hù)堆性質(zhì)切端,選取A,B中根節(jié)點(diǎn)權(quán)值較小的左偏樹(shù)作為A樹(shù)彻坛。
向下合并,將A的右兒子和B合并的樹(shù)的根節(jié)點(diǎn)作為A的右兒子踏枣。
為了維護(hù)左偏性質(zhì)昌屉,若左兒子的dist值小于右兒子的dist值,交換左右兒子茵瀑。
更新A樹(shù)根節(jié)點(diǎn)的dist,rt及左右兒子的rt间驮。
返回合并完畢的左偏樹(shù)A

inline int Merge(int x,int y){
    if(!x || !y)return x + y;
    if(tr[x].val > tr[y].val)swap(x,y);
    if(tr[x].val == tr[y].val && x > y)swap(x,y);
    rs = Merge(rs,y);
    if(tr[ls].dis < tr[rs].dis)swap(ls,rs);
    tr[ls].rt = tr[rs].rt = tr[x].rt = x;
    tr[x].dis = tr[rs].dis + 1;
    return x;
}
  1. 左偏樹(shù)的刪除
    僅限于刪除最小節(jié)點(diǎn)瘾婿。
    O(1)刪除最小節(jié)點(diǎn)蜻牢,重置左右兒子的根,合并左右兒子偏陪。
inline void Pop(int x){
    tr[x].val = -1;
    tr[ls].rt = ls;tr[rs].rt = rs;
    tr[x].rt = Merge(ls,rs);
}

注意
a) Merge(rs,y)要更新給rs抢呆。
b) 注意題目要求的輸出。
c) tr[0].dist = -1笛谦。
code

// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;

int N,M;

struct tree{
    int Ls,Rs,rt,val,dis;
}tr[100005];

inline int read(){
    int ret = 0,fl = 1;
    char c = getchar();
    for(;!isdigit(c)&&c != '-';c = getchar())if(c == '-')fl = 0;
    for(;isdigit(c);c = getchar())ret = (ret << 3) + (ret << 1) + c - 48;
    return fl ? ret : -ret;
}

#define ls tr[x].Ls
#define rs tr[x].Rs
inline int findf(int x){return tr[x].rt == x ? x : tr[x].rt = findf(tr[x].rt);}

inline int Merge(int x,int y){
    if(!x || !y)return x + y;
    if(tr[x].val > tr[y].val)swap(x,y);
    if(tr[x].val == tr[y].val && x > y)swap(x,y);
    rs = Merge(rs,y);
    if(tr[ls].dis < tr[rs].dis)swap(ls,rs);
    tr[ls].rt = tr[rs].rt = tr[x].rt = x;
    tr[x].dis = tr[rs].dis + 1;
    return x;
}

inline void Pop(int x){
    tr[x].val = -1;
    tr[ls].rt = ls;tr[rs].rt = rs;
    tr[x].rt = Merge(ls,rs);
}

int main(){
//  freopen("testdata.in","r",stdin);
//  freopen("testdata.out","w",stdout);

    N = read();M = read();tr[0].dis = -1;
    for(register int i = 1;i <= N;++i)
        tr[i].val = read(),tr[i].rt = i;
    for(register int i = 1;i <= M;++i){
        int op = read();
        if(op == 1){
            int x = read();int y = read();
            if(tr[x].val == -1||tr[y].val == -1)continue;
            x = findf(x);y = findf(y);
            if(x == y)continue;
            tr[x].rt = tr[y].rt = Merge(x,y);
        }
        else{
            int x = read();
            if(tr[x].val == -1)printf("-1\n");
            else{
                x = findf(x);
                printf("%d\n",tr[x].val);Pop(x);
            }
        }
    }
    return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抱虐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子饥脑,更是在濱河造成了極大的恐慌恳邀,老刑警劉巖懦冰,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異谣沸,居然都是意外死亡刷钢,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)乳附,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)内地,“玉大人,你說(shuō)我怎么就攤上這事赋除≮寤海” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵举农,是天一觀的道長(zhǎng)荆针。 經(jīng)常有香客問(wèn)我,道長(zhǎng)颁糟,這世上最難降的妖魔是什么航背? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮滚停,結(jié)果婚禮上沃粗,老公的妹妹穿的比我還像新娘。我一直安慰自己键畴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布突雪。 她就那樣靜靜地躺著起惕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咏删。 梳的紋絲不亂的頭發(fā)上惹想,一...
    開(kāi)封第一講書(shū)人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音督函,去河邊找鬼嘀粱。 笑死,一個(gè)胖子當(dāng)著我的面吹牛辰狡,可吹牛的內(nèi)容都是我干的锋叨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼宛篇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼娃磺!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起叫倍,我...
    開(kāi)封第一講書(shū)人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤偷卧,失蹤者是張志新(化名)和其女友劉穎豺瘤,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體听诸,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坐求,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了晌梨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞻赶。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖派任,靈堂內(nèi)的尸體忽然破棺而出砸逊,到底是詐尸還是另有隱情,我是刑警寧澤掌逛,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布师逸,位于F島的核電站,受9級(jí)特大地震影響豆混,放射性物質(zhì)發(fā)生泄漏篓像。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一皿伺、第九天 我趴在偏房一處隱蔽的房頂上張望员辩。 院中可真熱鬧,春花似錦鸵鸥、人聲如沸奠滑。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宋税。三九已至,卻和暖如春讼油,著一層夾襖步出監(jiān)牢的瞬間杰赛,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工矮台, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乏屯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓瘦赫,卻偏偏與公主長(zhǎng)得像辰晕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子耸彪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

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

  • 2.1.2 可并堆的定義 可并堆(Mergeable Heap)也是一種抽象數(shù)據(jù)類型伞芹,它除了支持優(yōu)先隊(duì)列的三個(gè)基本...
    Gitfan閱讀 1,365評(píng)論 0 0
  • 0.目錄 1.優(yōu)先隊(duì)列ADT 2.幾種實(shí)現(xiàn) 3.二叉堆 4.d-堆 5.左式堆 6.斜堆 7.二項(xiàng)隊(duì)列 8.斐波那...
    王偵閱讀 3,105評(píng)論 1 2
  • 一些概念 數(shù)據(jù)結(jié)構(gòu)就是研究數(shù)據(jù)的邏輯結(jié)構(gòu)和物理結(jié)構(gòu)以及它們之間相互關(guān)系,并對(duì)這種結(jié)構(gòu)定義相應(yīng)的運(yùn)算,而且確保經(jīng)過(guò)這...
    Winterfell_Z閱讀 5,854評(píng)論 0 13
  • 今天晚上是除夕唱较,今天也是我最高興的一天扎唾,我終于把我的簡(jiǎn)書(shū)賬號(hào)和密碼找到了。 從今天起南缓,我又可...
    黑白塵埃閱讀 159評(píng)論 0 0
  • 今天上午兒子學(xué)電子琴胸遇,本來(lái)昨天下午要學(xué)的,龍都客棧有參加高考的考生住汉形,取消了纸镊。 十點(diǎn)接回來(lái)時(shí),圖圖問(wèn):媽媽概疆,你還考...
    綸綸媽閱讀 317評(píng)論 2 3