How Many Answers Are Wrong-帶權並查
阿新 • • 發佈:2018-12-11
-
How Many Answers Are Wrong
- 經典帶權並查:
- 對於A~B之間的和是S,其實可以理解成B比A-1大S
- val記錄這個點到它相應最左的和
- fa記錄最左端的點
- 如果兩個點的左端不同則不會發生衝突 只需把根節點相對在右邊的更新val和fa即可
- 若左端點相同則需要判斷val[v]-val[u]與w是否相等。
-
#include<bits/stdc++.h> using namespace std; #define maxn 222200 int n,m,ans,u,v,w,a,b; int fa[maxn],val[maxn]; int fond(int x) { if(x==fa[x]) return x; int temp=fond(fa[x]); val[x]+=val[fa[x]]; return fa[x]=temp; } int main() { while(cin>>n>>m) { ans=0; for(int i=0; i<=n; i++) { fa[i]=i; val[i]=0; } while(m--) { cin>>u>>v>>w; u--; a=fond(u); b=fond(v); if(a<b) { fa[b]=a; val[b]=val[u]+w-val[v]; } else if(b<a) { fa[a]=b; val[a]=val[v]-val[u]-w; } else { if(val[v]-val[u]!=w) ans++; } } cout<<ans<<endl; } return 0; }