左偏樹有一些和時間複雜度證明有關的性質,但我們只要會用就好了
節點的距離:該節點到離它最近的葉節點的距離節點的左子節點的距離總是大於右子節點的距離
顯然節點的距離等於它右子節點的距離加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...