HDU3038 How Many Answers Are Wrong 并查集
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目传送门 - HDU3038
题意概括
有一个序列,共n个数,可正可负。
现在有m个结论。n<=200000,m<=40000
每个结论包括3个数a,b,s,表示序列中a~b的区间和为s。
现在让你依次判断结论的正确性。
如果当前结论与之前的矛盾,那么ans++,忽略该结论。
注意多组数据。
题解
这个差不多是带权并查集的板子题了……应该不用多说了。。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #include <cstring> #include <algorithm> #include <cstdio> #include <cstdlib> #include <cmath> using namespace std; const int N=200005; int n,m,fa[N],val[N]; int getf( int k){ if (fa[k]==k) return k; int res=getf(fa[k]); val[k]+=val[fa[k]]; return fa[k]=res; } int main(){ while (~ scanf ( "%d%d" ,&n,&m)){ for ( int i=0;i<=n;i++) fa[i]=i,val[i]=0; int ans=0; while (m--){ int a,b,s; scanf ( "%d%d%d" ,&a,&b,&s); a--; int Fa=getf(a),Fb=getf(b); if (Fa==Fb) ans+=(val[a]-val[b])!=s; else { fa[Fa]=Fb; val[Fa]=-val[a]+s+val[b]; } } printf ( "%d\n" ,ans); } return 0; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步