HDU3038 帶權並查集

2021-09-26 18:22:00 字數 841 閱讀 7380

題目連線:

給出m個區間,範圍為1到n,每給出乙個區間要求判斷是否與前面的區間矛盾如果矛盾則不處理,最終輸出矛盾區間的個數。

範圍:1<=n<=2e5 1<=m<=40000

考慮區間的幾種狀態:1.區間相離 2.區間相交 3. 區間內含 4.區間相切

區間相離:不會出現矛盾,直接進行區間合併

區間相交:通過調整,還是能滿足每個區間和為某個值

區間內含:兩個區間不會相互影響,直接合併即可

區間相切:相切的話,能合併則合併,如果已經存在共同根節點,則查詢是否矛盾

因為要考慮前乙個區間與這個區間的關係所以左端點需要-1,在查詢的時候對該點到根節點的距離進行更新。

如圖輸入左端點為x,右端點為y,x->y為z,sum為當前點到根節點的距離,則合併之後

sum[r2]=z-sum[y]+sum[x]

(需要注意方向)

#includeusing namespace std;

#define maxn 200005

#define ll long long

#define inf 1000000000000000009

#define ios ios::sync_with_stdio(false)

int ff[maxn],sum[maxn];

int find(int x)

int main()

else

}cout<

}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...