開始時n
nn個只有乙個數的集合,要求支援
合併兩個集合
查詢乙個集合中的最小值並刪除
左偏樹就是維護乙個滿足以下性質的樹
對於v al
xval_x
valx有val
x llsx val_xva lxllsx 且v al x lrsx val_xva lxlrsx 對於任何節點有左子樹的深度大於右子樹的深度 每次合併時我們只需要將val valva l小的合併到val valva l大的右子樹上,然後每次合併完之後就判斷左右兩邊的深度大小。 時間複雜度o(n logn) o(n\log n) o(nlogn) #include #include using namespace std; const int n= 1e5+10; int n,m,val[n] ;struct left_tree void del( int x) intget (int x) }t;int main() if(op==2) x=t. get(x) ;printf ("%d\n" ,val[x] );t. del(x);} }} 如題,一開始有n個小根堆,每個堆包含且僅包含乙個數。接下來需要支援兩種操作 操作1 1 x y 將第x個數和第y個數所在的小根堆合併 若第x或第y個數已經被刪除或第x和第y個數在用乙個堆內,則無視此操作 操作2 2 x 輸出第x個數所在的堆最小數,並將其刪除 若第x個數已經被刪除,則輸出 1並無視刪... 如題,一開始有n個小根堆,每個堆包含且僅包含乙個數。接下來需要支援兩種操作 操作1 1 x y 將第x個數和第y個數所在的小根堆合併 若第x或第y個數已經被刪除或第x和第y個數在用乙個堆內,則無視此操作 操作2 2 x 輸出第x個數所在的堆最小數,並將其刪除 若第x個數已經被刪除,則輸出 1並無視刪... 如題,一開始有 nn 個小根堆,每個堆包含且僅包含乙個數。接下來需要支援兩種操作 1 x y 將第 xx 個數和第 yy 個數所在的小根堆合併 若第 xx 或第 yy 個數已經被刪除或第 xx 和第 yy 個數在用乙個堆內,則無視此操作 2 x 輸出第 xx 個數所在的堆最小數,並將這個最小數刪除 ...#include
P3377 模板 左偏樹(可並堆)
P3377 模板 左偏樹(可並堆)
P3377 模板 左偏樹(可並堆)