HDU 3038 How Many Answers Are Wrong

原创 2012年03月22日 09:53:40

题目大意:有n次询问,给出a到b区间的总和,问这n次给出的总和中有几次是和前面已近给出的是矛盾的??

做了好长时间了,现在整理一下

首先说明的是,这个是并查集的一种应用,刚开始的时候我还以为是线段树之类的东西呢。但是苦思无解,最后还是看了解题报告,原来是并查集,看完解题报告,我发现,有一组数据我一直想不明白,

10 3
1 2 2
3 4 2
2 4 100

呵呵,我傻了,我以为1到2和为2,3到4和为2,2到4和不会超过4呢!!哎,这么傻怎么还弄acm呢?呜呜,在这儿感谢新浪的Jopix给我指点。(-98,100,1, 1)


言归正传,说说这个题的思路。首先,

如果我们知道a到b之间的关系,a到c之间的关系,那么我们就可以知道a,b,c任意两个之间的关系,如果我们再知道了d和c之间的关系,那么我们就知道了a,b,c,d之间的关系,但是怎么表示这些关系呢??我们用的是并查集,顺便加一个每一个节点到根的距离,这样的话,任意两个点之间关系就可以通过求与根的距离求差得出,也就是说,如果输入的n,m在一个集合里,那么我们判断这两个的关系是否和已有的冲突,如果n,m不在一个集合里,那么我们就合并这两个集合,是的n,m这两个所在的两个集合之间的任意元素都有关系。

ok

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
#define N 200020
int set[N],sum[N];

int n,m;

int find(int x)
{
    if(set[x] == x) return x;
    int t = set[x];
    set[x] = find(set[x]);
    sum[x] += sum[t];
    return set[x];
}

void merge(int x,int y,int a,int b,int v)
{
    if(x > y)
    {
        set[y] = x;
        sum[y] = sum[a]-v-sum[b];
    }else
    {
        set[x] = y;
        sum[x] = v + sum[b] - sum[a];
    }
}

void init()
{
    memset(sum,0,sizeof(sum));
    for(int i = 0;i <= n;i++)   set[i] = i;
}

int main()
{
    while(scanf("%d%d",&n,&m) != EOF)
    {
        init();
        int a,b,v,re = 0;
        for(int i = 0;i < m;i++)
        {
            scanf("%d%d%d",&a,&b,&v);
            a--;
            //b++;
            int x = find(a);
            int y = find(b);
            if(x == y && sum[a] != sum[b] + v)
            {
                re++;
            }
            else if(x != y)
                merge(x,y,a,b,v);
        }
        printf("%d\n",re);
    }
    return 0;
}



HDU 3038 How Many Answers Are Wrong(并查集)

转载请注明出处,谢谢http://blog.csdn.net/acm_cxlove/article/details/7854526       by---cxlove  题目:给出一些询问,[l...

hdu3038

并查集。。。 第一次写带权并查集,感觉好难理解,看别人代码看了一上午才看懂,好弱菜的说。。。 所谓带权并查集,指的是在合并时不仅要将区间合并,而且要记录某些信息,记录的方法类似于数学的坐标系,以一...

HDU 3038 How Many Answers Are Wrong? (带权并查集)

链接: http://acm.hdu.edu.cn/showproblem.php?pid=3038 题目: Problem Description TT and FF...

hdu 3038 How Many Answers Are Wrong (带权并查集)

TT and FF are ... friends. Uh... very very good friends -________-b  FF is a bad boy, he is alway...

HDU 5495 LCS (并查集判环)

【题目链接】:click here~~ 【题目大意】: Problem Description You are given two sequence {a1,a2,...,an} a...

HDU 3038 How Many Answers Are Wrong(路径压缩并查集)

HDU3038 How Many Answers AreWrong(路径压缩并查集) 分析:本题与POJ1733很相似,也是连续区间的并查集问题. http://blog.csdn.net/u0134...

HDU-3038 How Many Answers Are Wrong

题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=66964#problem/D 题目大意:给你M个区间和,问你有几个是与前面矛盾的...

*hdu3038 (带权值并查集)

题目大意:有n次询问,给出a到b区间的总和,问这n次给出的总和中有几次是和前面已近给出的是矛盾的?? 思路:如果我们知道a到b之间的关系,a到c之间的关系,那么我们就可以知道a,b,c任意两个之间的...

HDU-3038-How Many Answers Are Wrong

ACM模版描述题解有人说这道题是种类并查集,可能是我的概念不好吧,带权并查集搞搞就行了,和HDU 3047 Zjnu Stadium几乎代码一模一样,不同的是,这个题的思路容易跑偏,可能会想到线段树(...
  • f_zyj
  • f_zyj
  • 2016年11月05日 17:43
  • 256

hdu 3038 How Many Answers Are Wrong (带权并查集入门)

http://acm.hdu.edu.cn/showproblem.php?pid=3038 How Many Answers Are Wrong Time Limit: 2000/1000 MS ...
  • F_cff
  • F_cff
  • 2017年04月20日 10:19
  • 179
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU 3038 How Many Answers Are Wrong
举报原因:
原因补充:

(最多只允许输入30个字)