【題目描述】
永無鄉包含 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 1sam4 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
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 來表示。某些島之間由巨大的橋連...