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;
}

  

posted @   zzd233  阅读(224)  评论(0编辑  收藏  举报
努力加载评论中...

点击右上角即可分享
微信分享提示