HDU 3038 How Many Answers Are Wrong(kuangbin带你飞 专题五:并差集)
2015-01-29 15:45
459 查看
大概题意是说,给定一个n,然后m个区间和...问这些个区间和有多少个是矛盾的...比如 [1,10]=20,[1,5]=[10],[6,10]如果等于10肯定不矛盾,但是如果等去其他的就矛盾了...
这个是带权并差集....貌似是吧。开一个sum数组,存一下1-i的区间和,毕竟区间和运算有a-b的区间和=sum[b]-sum[a]...so用这个玩意就行了..每次合并如果不在一起集合,合并的时候顺便计算一下到父节点的区间和...
这个是带权并差集....貌似是吧。开一个sum数组,存一下1-i的区间和,毕竟区间和运算有a-b的区间和=sum[b]-sum[a]...so用这个玩意就行了..每次合并如果不在一起集合,合并的时候顺便计算一下到父节点的区间和...
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<iostream> using namespace std; int f[300000],sum[300000],n,m; void inti() { for(int i=0;i<=n;i++) { f[i]=i; sum[i]=0; } } int find(int x) { if(x!=f[x]) { int t=f[x]; f[x]=find(f[x]); sum[x]+=sum[t];//并差集路径压缩的过程中顺便压缩一下x到根的和 return f[x]; } return x; } int main() { while(cin>>n>>m) { inti(); int x,y,s; int ans=0; for(int i=0;i<m;i++) { cin>>x>>y>>s; x=x-1; int dx=find(x); int dy=find(y); if(dx!=dy) { f[dy]=dx; sum[dy]=sum[x]-sum[y]+s; } else { if(sum[y]-sum[x]!=s) ans++; } } cout<<ans<<endl; } return 0; }
相关文章推荐
- hdu 3038D - How Many Answers Are Wrong [kuangbin带你飞]专题五 并查集
- kuangbin专题五: D - How Many Answers Are Wrong HDU - 3038 (带权并查集)
- hdu 3038 How Many Answers Are Wrong【并查集的简单应用】
- HDU-3038 How Many Answers Are Wrong 带权并查集
- hdu 3038 How Many Answers Are Wrong【并查集的简单应用】
- HDU-3038 How Many Answers Are Wrong
- hdu 3038 How Many Answers Are Wrong
- HDU 3038 How Many Answers Are Wrong
- hdu 3038 How Many Answers Are Wrong
- HDU 3038 How Many Answers Are Wrong
- 杭电hdu 3038 how many answers are wrong 并查集求解
- HDU 3038 How Many Answers Are Wrong
- HDU 3038 How Many Answers Are Wrong (带权并查集+区间判断)
- HDU 3038 How Many Answers Are Wrong
- hdu 3038 - How Many Answers Are Wrong(并查集)
- hdu 3038 How Many Answers Are Wrong (带权并查集)
- HDU 3038 How Many Answers Are Wrong
- HDU 3038 How Many Answers Are Wrong (并查集路径压缩)
- HDU 3038 How Many Answers Are Wrong - 并查集
- hdu 3038 How Many Answers Are Wrong(并查集)