題意:
給出m組區間[a,b],以及其區間的和,問有矛盾的有幾組;
思路:種類並查集。
主要是幾個關係:同類元素的關係,父親與兒子的關係,不同類元素的關係;
我們可以類似看作乙個字首和,sum[x]是x到根這段路徑上的和,那麼根一定是座標越小的,那麼如果說對於同類(同乙個集合)的判斷就是sum[b]-sum[a-1]是否等於給出值
如果是不同類的話:組合,大的值歸到小的去。
考慮區間[x,y],xx是x的根,yy是y的根
第一種:yy>xx
xx sum[xx]
yy sum[yy]
x sum[x]
valy sum[y]
pre[yy]=xx;
sum[yy] = sum[x] + val - sum[y];
第二種:xx>yy
yy sum[yy]
xx sum[xx]
x sum[x]
valy sum[y]
pre[xx]=yy;
sum[xx] = sum[y] - sum[x] - val;
在狀態壓縮的時候,就是乙個字首和嘛,直接把之前的加過來就好了。
#includeusing namespace std;
const int n=2e5+10;
int sum[n],pre[n],ans,n,m;
int find(int x)
void merge(int x,int y,int val)
else if(xx
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...