並查集 treap實現名次數 BZOJ2733

2021-06-28 22:12:42 字數 1773 閱讀 2581

time limit: 10 sec  

memory limit: 128 mb

submit: 1351  

solved: 710 [

submit][

status]

永無鄉包含 n 座島,編號從 1 到 n,每座島都有自己的獨一無二的重要度,按照重要度可 以將這 n 座島排名,名次用 1 到 n 來表示。某些島之間由巨大的橋連線,通過橋可以從乙個島 到達另乙個島。如果從島 a 出發經過若干座(含 0 座)橋可以到達島 b,則稱島 a 和島 b 是連 通的。現在有兩種操作:b x y 表示在島 x 與島 y 之間修建一座新橋。q x k 表示詢問當前與島 x連通的所有島中第 k 重要的是哪座島,即所有與島 x 連通的島中重要度排名第 k 小的島是哪 座,請你輸出那個島的編號。 

輸入檔案第一行是用空格隔開的兩個正整數 n 和 m,分別 表示島的個數以及一開始存在的橋數。接下來的一行是用空格隔開的 n 個數,依次描述從島 1 到島 n 的重要度排名。隨後的 m 行每行是用空格隔開的兩個正整數 ai 和 bi,表示一開始就存 在一座連線島 ai 和島 bi 的橋。後面剩下的部分描述操作,該部分的第一行是乙個正整數 q, 表示一共有 q 個操作,接下來的 q 行依次描述每個操作,操作的格式如上所述,以大寫字母 q 或b 開始,後面跟兩個不超過 n 的正整數,字母與數字以及兩個數字之間用空格隔開。 對於 20%的資料 n≤1000,q≤1000

對於 100%的資料 n≤100000,m≤n,q≤300000 

對於每個 q x k 操作都要依次輸出一行,其中包含乙個整數,表 示所詢問島嶼的編號。如果該島嶼不存在,則輸出-1。 

5 1

4 3 2 5 1

1 2

7q 3 2

q 2 1

b 2 3

b 1 5

q 2 1

q 2 4

q 2 3 -12

512兩種操作:b x,y連線x島和y島,q x,k查詢跟x相連的第k小的島的編號

#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

const int maxn=200010;

int pra[maxn];

int n,m,q;

int a[maxn];

int tot;

int root[maxn];

struct node

int cmp(int x)const

}maintain(o);

}void remove(int &o,int x)

else

}else remove(tree[o].ch[d],x);

if(o)maintain(o);

}int get_max(int o)

int get_min(int o)

int get_pred(int o,int val,int y)

int get_succ(int o,int val,int y)

int get_kth(int o,int k)

int get_rank(int o,int val)

int find(int x)

void merge(int &src,int &dest)

void query(int x,int k)

{ x=find(x);

if(tree[root[x]].s

java實現並查集

並查集是根據這篇博文學習的,寫得很不錯 下面是實現 public class unionfindset count n 合併p,q所在集合 param p param q public void union int p,int q if size rootp size rootq else coun...

C 實現並查集

將n個不同的元素分成一組不相交的集合。開始時,每個元素就是乙個集合,然後按規律將兩個集合進行合併。假如已知有n個人和m對好友關係 存於陣列r 如果兩個人是直接的或間接的好友關係 好友的好友的好友.則認為他們屬於同一好友圈,請求出這n個人中有幾個好友圈。例如 n 5,m 3,r 表示有5個人,1和2是...

並查集實現(c )

1.何為並查集?並查集是一種樹型的資料結構,用於處理一些不相交集合的合併及查詢問題,簡單的說就是對集合操作的一種資料結構。2.做什麼用 考慮這樣乙個問題 若某個家族人員過於龐大,要判斷兩個是否是親戚,確實還很不容易,給出某個親戚關係圖,求任意給出的兩個人是否具有親戚關係。規定 x和y是親戚,y和z是...