題目大意:: n表示有乙個長度為n的陣列, 接下來有m行形如x, y, d的輸入, 表示從第x,個元素到第y個元素的和為d(包括x, 和y), 問m行輸入裡面有幾個是錯誤的(第乙個輸入是正確的);
思路參考:
這題你不告訴我是並查集,我怎麼想得到。。。
複習一下帶權並查集吧。用dis陣列維護乙個點到他當前父親節點的距離,那麼在find_set時就可以動態地更新這個值,這就叫做路徑壓縮。
這題思路如下,一切盡在不言中
**如下:
#include #include #include #include #include #include #include using namespace std;
const int maxn=200000+10;
int fa[maxn];
int dis[maxn];//維護每個點到其父節點的距離
int find_set(int x)
else
}int union(int x,int y,int d)
}else
else
}return 1;
}int main()
memset(dis,0,sizeof(dis));
int ans=0;
for(int i=1;i<=m;i++)
}printf("%d\n",ans);
}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句話,判斷謊言的個數,謊言就是與前面真話衝突的話。帶權並查集的典型題。個人覺得帶權並查集就是給出了結點的相對關係,已知相對關係的點就放到乙個連通的塊裡,也就是並查集有同乙個根節點。這些相對關係又能轉化到乙個結點上,這個結點就是它們共有根節點,而轉化到同一結點的過程就是路徑壓縮的過程。...