左偏樹學習記錄

2021-08-21 12:21:16 字數 1423 閱讀 3242

左偏樹有一些和時間複雜度證明有關的性質,但我們只要會用就好了

節點的距離:該節點到離它最近的葉節點的距離

節點的左子節點的距離總是大於右子節點的距離

顯然節點的距離等於它右子節點的距離加1

合併(merge)

int merge(int x,int y) 

ch[x][1]=merge(ch[x][1],y); //將y並到x的右子樹上

f[ch[x][1]]=x; //新的樹父節點為x

if(d[ch[x][0]]1]]) //如果變為右偏樹,則交換兩棵子樹

swap(ch[x][0],ch[x][1]);

d[x]=d[ch[x][1]]+1; //維護該節點的距離

return x;

}

刪除(pop)
將該節點的左右子節點合併

void pop(int x)
由左偏樹的性質可得,時間複雜度為

log(n)

log⁡(n

)

我都說了只要會用就好了

例題(luogu p3377 【模板】左偏樹(可並堆))

@luogu

直接套模板

#include

#include

#include

#define max(x,y) ((x)>(y) ? (x) : (y))

#define min(x,y) ((x)<(y) ? (x) : (y))

#define n 100010

#define ll long long

using

namespace

std;

inline

int getint()

return t*p;

}int n,m,a[n],f[n],d[n],ch[n][2];

int merge(int x,int y)

ch[x][1]=merge(ch[x][1],y);

f[ch[x][1]]=x;

if(d[ch[x][0]]1]])

swap(ch[x][0],ch[x][1]);

d[x]=d[ch[x][1]]+1;

return x;

}int getroot(int x)

void pop(int x)

int main()

merge(getroot(x),getroot(y));

} else else }}

return

0;}

左偏樹學習筆記

左偏樹是一種基於二叉樹的可並堆。定義乙個節點的 距離 dis xdis x disx 為它到空節點的最短路長度,左偏樹強制要求 dis lson dis rson dis ge dis dislso n d isrs on 所以 dis x di srso n 1dis x dis 1 disx d...

左偏樹 學習筆記

首先要知道左偏樹是用來幹什麼的。如果給我們兩個優先序列,然後讓我把這兩個優先佇列合併成乙個優先佇列。如果直接用堆,就是將乙個佇列裡面的數不斷彈出然後扔到另乙個佇列裡。複雜度是 o n n為佇列中數的個數。但是用左偏樹就可以做到 log n 1 n 2 ps 為了便於討論,本文所有的左偏樹均已小根樹為...

學習筆記 左偏樹

左偏樹是一種可並堆,除了堆的基本功能,最大的特點就是支援合併堆,甚至比普通堆好寫。下面敘述以小根堆為例,大根堆對稱。o log n 求乙個數所在堆的根 o 1 求最小值 o log n 合併兩個堆 o log n 刪除最小值 o log n 插入乙個數 n 是插入的總節點數 或當前堆的節點數 str...