HDU--3308 How Many Answers Are Wrong

末蓝、 2022-08-11 00:57 30阅读 0赞

这一道题是水题一道,但是我能说我做了将近三个小时吗。。。就是一直在纠结如何存储端点的值。在百思不得其解得的时候终于搜了一下,结果呵呵。把闭区间改成半开半闭区间不就完事了吗、、、剩下的完全就是加权并查集了。

下面的代码是让大的点做根,小的点做的是叶子,那么叶子的权值就是正值了。。。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cstdlib>
  4. #define N 200005
  5. int pa[N];
  6. __int64 rank[N];
  7. int find(int x)
  8. {
  9. if(x!=pa[x])
  10. {
  11. int tmp=pa[x];
  12. pa[x]=find(tmp);
  13. rank[x]+=rank[tmp];
  14. }
  15. return pa[x];
  16. }
  17. int initial(int n)
  18. {
  19. for(int i=0;i<=n;i++)
  20. {
  21. pa[i]=i;
  22. }
  23. memset(rank,0,sizeof(rank));//n在不大的情况下,它可能较费些时间
  24. }
  25. int main()
  26. {
  27. int n,m,count;
  28. while(scanf("%d%d",&n,&m)==2)
  29. {
  30. count=0;
  31. initial(n);
  32. while(m--)
  33. {
  34. int x,y;__int64 Rank;//防止出现超过2^31 int越界,当然unsigned也行,不过到边的感觉让我没有安全感
  35. scanf("%d%d%I64d",&x,&y,&Rank);
  36. --x;
  37. int px=find(x),py=find(y);
  38. if(px!=py)
  39. {
  40. pa[px]=py;//取较大的点做根
  41. rank[px]=-rank[x]+rank[y]-Rank;//画一下,很容易明白
  42. }
  43. else
  44. {
  45. if(rank[y]-rank[x]!=Rank)
  46. count++;
  47. }
  48. }
  49. printf("%d\n",count);
  50. }
  51. return 0;
  52. }

发表评论

表情:
评论列表 (有 0 条评论,30人围观)

还没有评论,来说两句吧...

相关阅读

    相关 HDU--3308 How Many Answers Are Wrong

    这一道题是水题一道,但是我能说我做了将近三个小时吗。。。就是一直在纠结如何存储端点的值。在百思不得其解得的时候终于搜了一下,结果呵呵。把闭区间改成半开半闭区间不就完事了吗、、、