題目連線:
給出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...