hdu 3038 擴充套件並查集 向量思想

2021-08-19 00:10:40 字數 1229 閱讀 4502

題意:給出區間[1,n],下面有m組資料,l r v區間[l,r]之和為v,每輸入一組資料,判斷此組條件是否與前面衝突 ,最後輸出與前面衝突的資料的個數.

看大佬的部落格:

向量偏移好秀啊,可以直接找到根節點和子節點的關係。

對於集合裡的任意兩個元素x,

y而言,它們之間必定存在著某種聯絡,因為並查集中的元素均是有聯絡的,否則也不會被合併到當前集合中。那麼我們就把這

2個元素之間的關係量轉化為乙個

偏移量。

這一題sum[maxn]陣列儲存的是從一點到其祖先節點的距離。

x的當前集合根節點

rootx,y

的當前集合根節點

rooty

,x->y

的偏移值為

c;(1)如果rootx和rooty不相同,那麼我們把rootx合併到rooty上,並且更新sum[rootx]的值;

向量偏移r

ootx->rooty  =  rootx->x + x->y + y->rooty  =  -x->rootx+ x->y + y->rooty 

即sum[rootx]   =  -sum[x] + c + sum[y]

(2)如果rootx和rooty相同,(即x

和y在已經在乙個集合中,不需要合併操作了,根結點相同

),那麼我們就驗證

x->y

之間的偏移量是否與題中給出的c一致

向量偏移 x->y  =  x->rootx + rootx->y

即sum[x] - sum[y] == c ?

sum[maxn]陣列的更新在路徑壓縮的時候已經更新

#include#include#include#include#include#include#include using namespace std;

const int maxn = 200000 + 10;

const int inf = 1e9 + 7;

int n;

int father[maxn];

int sum[maxn];

void init(int n)

}// 獲取根結點

int getf(int x)

return father[x];

}int main()

}else

}cout << ans << endl;

}return 0;

}

hdu 3038 帶權並查集)

思路 sum x 表示區間 x,f x 的和,這個可以在路徑壓縮的時候更新,對於一組資料 u,v,w 令r1 find u r2 find v 於是若r1 r2,此時u,v就有了相同的參考點,而sum u 為區間 u,r1 r2 的和,sum v 為區間 v,r2 r1 的和,於是只需判斷w sum...

hdu 3038 帶權並查集)

思路 sum x 表示區間 x,f x 的和,這個可以在路徑壓縮的時候更新,對於一組資料 u,v,w 令r1 find u r2 find v 於是若r1 r2,此時u,v就有了相同的參考點,而sum u 為區間 u,r1 r2 的和,sum v 為區間 v,r2 r1 的和,於是只需判斷w sum...

HDU 3038 帶權並查集

題目大意 n表示有乙個長度為n的陣列,接下來有m行形如x,y,d的輸入,表示從第x,個元素到第y個元素的和為d 包括x,和y 問m行輸入裡面有幾個是錯誤的 第乙個輸入是正確的 思路參考 這題你不告訴我是並查集,我怎麼想得到。複習一下帶權並查集吧。用dis陣列維護乙個點到他當前父親節點的距離,那麼在f...