題意:給出區間[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...