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://acm.hust.edu.cn/vjudge/contest/view.action?cid=66964#problem/D 题目大意:给你M个区间和,问你有几个是与前面矛盾的...
  • backforward
  • backforward
  • 2016年07月12日 14:52
  • 638

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

题目链接:[kuangbin带你飞]专题五 并查集 D - How Many Answers Are Wrong题意 有n次询问,给出a到b区间的总和,问这n次给出的总和中有几次是和前面已近给出的...
  • to_be_better
  • to_be_better
  • 2016年03月29日 20:59
  • 1179

How Many Answers Are Wrong(并查集)

How Many Answers Are Wrong Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (...
  • qq_32823673
  • qq_32823673
  • 2017年04月11日 14:19
  • 145

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 always ...
  • qq_36368339
  • qq_36368339
  • 2017年02月15日 21:18
  • 226

How Many Answers Are Wrong 并查集

题意为前两个数之间的和为第三个数,这个题我们可以这么考虑,比如a 到 b之间和为 s,那么 s = (开始到b之间的和) - (开始到a-1之间的和),ab的根相等 那么它们在一个集合里 那么s即为它...
  • tydfhihfhgjkj
  • tydfhihfhgjkj
  • 2015年09月14日 22:43
  • 122

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

转载请注明出处,谢谢http://blog.csdn.net/acm_cxlove/article/details/7854526       by---cxlove  题目:给出一些询问,[l...
  • ACM_cxlove
  • ACM_cxlove
  • 2012年10月18日 17:44
  • 3357

图论练习

(转载)图论精华精辟500题 Admin 2012年12月26日 名人名言:爱情使是非概念混淆不清;强烈的爱情和骄傲的野心都是没有疆界的——约·德莱顿  =====================...
  • u011483306
  • u011483306
  • 2013年10月30日 16:38
  • 1059

hdu3038

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

HDU 3038

带权并查集/************************************************************************* > File Name: hdu...
  • Dextrad_ihacker
  • Dextrad_ihacker
  • 2016年03月29日 22:56
  • 292

hdu 3038 How Many Answers Are Wrong

/* 这题一开始由于一个问题怎么也出不来,这问题可以用下列数据表示 10 2 1 10 100 5 6 101 AC代码输出时0,不解,是我理解出错了,还是题目有问题,抑或是测试数据太水呢?...
  • a601025382s
  • a601025382s
  • 2012年11月27日 16:26
  • 368
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU 3038 How Many Answers Are Wrong
举报原因:
原因补充:

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