HNOI2012 永無鄉 splay合併

2021-09-23 01:55:27 字數 2295 閱讀 6365

【題目描述】

永無鄉包含 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 的正整數,字母與數字以及兩個數字之間用空格隔開。

【輸出格式】

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

s am

plei

nput

sample~~input

sample

inpu

t

5 1

4 3 2 5 1

1 27

q 3 2

q 2 1

b 2 3

b 1 5

q 2 1

q 2 4

q 2 3

sam

pleo

utpu

tsample~~output

sample

outp

ut

-125

12

【題意分析】

跟yyborz學的splaydsu

題意就是維護一些聯通塊,並查詢在聯通塊中的排名。

有合併操作:將兩個聯通塊合併。

這個dsu很暴力:啟發式將小樹節點乙個乙個插到大樹裡進去。因為size可以預處理。

還有預處理比較麻煩:我們構建n棵splay,第i棵的根節點位於n+i,這樣我們就建立起了對應關係。然後splay的時候如果發現目標節點<=n,那麼就意味著旋到了某棵splay的根,然後將這棵splay的根重置。

注意前1至n個節點是虛擬的,真正的節點從n+1開始,從n+1開始只是方便處理根節點。

所以之後插入節點要從2n+1開始。

code:

#include

#include

#include

#include

#include

#include

#define maxn 300200

using

namespace std;

int n, m, sz, id[maxn]

;struct _splay

int getfather (

int x)

inline

void rotate (

int x)

inline

void splay (

int x,

int goal)

if(goal <= n) root[goal]

= x;

}inline

void insert (

int x,

int y)

void dfs (

int now,

int y)

inline

void merge (

int xx,

int yy)

int kth (

int x,

int rank)

}tree;

int main (

)for

(register

int i =

1; i <= m; i++

) scanf (

"%d"

,&m)

;for

(register

int i =

1; i <= m; i++)}

return0;

}

HNOI2012 永無鄉 題解

對於每乙個點先建立乙個權值線段樹,之後並查集維護 更改連通性。不知道權值線段樹是啥的戳我 聯通就直接把祖先連起來然後合併線段樹 include include using namespace std const int n 100005 int size n 20 n,m,fa n type,q,r...

luogu解題報告 HNOI2012永無鄉

啟發式合併 平衡樹 並查集 複雜度o n lg2n 還是可以過的.splay一次寫過然而後面各種跪.除錯能力捉急 估計是wc2017課前助眠 聽太多了 include using namespace std const int n 100005 struct node tree n 30 int t...

線段樹合併 HNOI2012 永無鄉

問題 b hnoi2012 永無鄉 時間限制 1 sec 記憶體限制 128 mb 提交 50 解決 28 提交 狀態 討論版 題目描述 永無鄉包含 n 座島,編號從 1 到 n,每座島都有自己的獨一無二的重要度,按照重要度可 以將這 n 座島排名,名次用 1 到 n 來表示。某些島之間由巨大的橋連...