bzoj 2733 Splay 啟發式合併,名次樹

2022-06-02 13:03:12 字數 1509 閱讀 7845

題意:給定乙個帶點權的無向圖,有兩種操作:

1、將兩個連通分量合併。

2、查詢某個連通分量裡的第k大點。

題解:用並查集維護連通關係,一開始建立n棵splay樹,然後不斷合併,查詢。

處理技巧:

1、每個頂點u所在的splay就是t[find(u)]。

2、每個頂點在樹中對應的節點編號就是該頂點的編號。

1 #include 2 #include 3

#define maxn 100110

4using

namespace

std;56

7int key[maxn], pre[maxn], son[maxn][2

], siz[maxn], ntot;

8struct

splay

11void update( int

nd )

14void rotate( int nd, int

d )

31void splay( int nd, int top=0

) else

else47}

48}49}

50int initnode( int nd, int k, int

p )

57void insert( int k, int

nnd )

62int nd =root;

63while( son[nd][ k>key[nd] ] )

64 nd = son[nd][ k>key[nd] ];

65 son[nd][ k>key[nd] ] =initnode(nnd,k,nd);

66update( nd );

67splay( nd );68}

69int nth( int

n ) else

if( n>=ls+2

) else81}

82splay(nd);

83return

nd;84

}85 inline int size()

86static

void join( splay &t , int

snd )

92};

9394

intn, m, q;

95int

fa[maxn];

96splay t[maxn];

9798

int find( int

a )

101102

void join( int a, int

b )

108109

intmain()

116for( int i=1,u,v; i<=m; i++)

120 scanf( "

%d", &q );

121while( q--) else

131}

132 }

view code

BZOJ2733 永無鄉 splay啟發式合併

作者部落格 永無鄉包含 n 座島,編號從 1 到 n,每座島都有自己的獨一無二的重要度,按照重要度可 以將這 n 座島排名,名次用 1 到 n 來表示。某些島之間由巨大的橋連線,通過橋可以從乙個島 到達另乙個島。如果從島 a 出發經過若干座 含 0 座 橋可以到達島 b,則稱島 a 和島 b 是連 ...

bzoj2733 永無鄉 線段樹合併

這道題是一道經典的平衡樹 啟發式合併吧。那麼考慮用可持久化線段樹來寫。對每乙個節點儲存一棵線段樹表示所在塊的編號的集合 因此可以乙個塊值儲存一棵樹 然後合併的時候就地櫃合併左子節點和右子節點,然後更新節點的值即可。時空複雜度o nlogn ac 如下 include include include ...

BZOJ 2733 永無鄉 線段樹合併

time limit 10 sec memory limit 128 mb submit 3624 solved 1937 submit status discuss 永無鄉包含 n 座島,編號從 1 到 n,每座島都有自己的獨一無二的重要度,按照重要度可 以將這 n 座島排名,名次用 1 到 n ...