HDU 3038 - How Many Answers Are Wrong(带权的并查集,其实俺真不知道为啥带权,俺只知道多了个父子关系)

昨天做了个POJ-食物链的带权并查集,那可把我难为死了,看了几个博客,都是一个公式解决,并没有详细解说为什么这样做,所以喜欢寻根问底的我(●'◡'●)苦思冥想,终于从中得到了启发,这个题的解题思路也相似。

 

解决这种带权并查集问题,与并查集问题(father[N])只是多加了个关系,这个关系表示与他父亲的关系,我把他记作relat[N],

关键就是怎样通过关系,来构建一个关系表达式,使得求两个数的关系可以通过其他关系来间接求出

上面的就是基本的思想,下面咱们来就题论题。

先放题目:

 

TT and FF are ... friends. Uh... very very good friends -________-b

FF is a bad boy, he is always wooing TT to play the following game with him. This is a very humdrum game. To begin with, TT should write down a sequence of integers-_-!!(bored).


Then, FF can choose a continuous subsequence from it(for example the subsequence from the third to the fifth integer inclusively). After that, FF will ask TT what the sum of the subsequence he chose is. The next, TT will answer FF's question. Then, FF can redo this process. In the end, FF must work out the entire sequence of integers.

Boring~~Boring~~a very very boring game!!! TT doesn't want to play with FF at all. To punish FF, she often tells FF the wrong answers on purpose.

The bad boy is not a fool man. FF detects some answers are incompatible. Of course, these contradictions make it difficult to calculate the sequence.

However, TT is a nice and lovely girl. She doesn't have the heart to be hard on FF. To save time, she guarantees that the answers are all right if there is no logical mistakes indeed.

What's more, if FF finds an answer to be wrong, he will ignore it when judging next answers.

But there will be so many questions that poor FF can't make sure whether the current answer is right or wrong in a moment. So he decides to write a program to help him with this matter. The program will receive a series of questions from FF together with the answers FF has received from TT. The aim of this program is to find how many answers are wrong. Only by ignoring the wrong answers can FF work out the entire sequence of integers. Poor FF has no time to do this job. And now he is asking for your help~(Why asking trouble for himself~~Bad boy)

Input

Line 1: Two integers, N and M (1 <= N <= 200000, 1 <= M <= 40000). Means TT wrote N integers and FF asked her M questions.

Line 2..M+1: Line i+1 contains three integer: Ai, Bi and Si. Means TT answered FF that the sum from Ai to Bi is Si. It's guaranteed that 0 < Ai <= Bi <= N.

You can assume that any sum of subsequence is fit in 32-bit integer.

Output

A single line with a integer denotes how many answers are wrong.

Sample Input

10 5
1 10 100
7 10 28
1 3 32
4 6 41
6 6 1

Sample Output

1

题意:

 

给出一个n,和m,表示总共有n个数组成的数列,下面问m个回复,每个问题由三部分组成,p q v,表示数列中从第p个数到第q个数的元素的和v。

要你找出其中错误回复的个数--也就是这个回答与上面的冲突。

根据题意,思考,构建模型。确定下来用构建并查集,

因为 a b的v中包含a b,所以用并查集向量的方式不容易得出其中的线性关系但是如果我让a表示p-1,b表示q ,那么此时的a b v 就表示不带左端点的从a到b的元素和v,那么其中就可以表示一些线性关系了

********************                                                             做个标识-----------  A->B 表示 A到其父节点B的 V。

 

当a<b, b<c时   有下面的关系成立

即    a->b+b-c=a->c                      方程式  ①

好好斟酌一下就可以理解这个关系式   

 

————————————————————————————————————————————

那么当b>c是还符合吗 ?

NO!!      当 a<b b>c时  a->b+b->c并不等于a->c 看下面的证明过程

(●'◡'●)  画的不好凑合着先用

  

a->b 包含端点b 但是b->c不包含端点b 

故在计算时a->b+b->c 其实等于 a->(c-1 )+b  可见并不等同于a->c         (你可以试着计算一下a->b+c->b)

-----------------------------————————————————————————————————————————————————————————————————

 

 

所以要想保证该模型有方程式①的线性关系,那么就必须保证a<b  b<c 。这样才能得出 a->c

所以咱们构建的并查集要想实现这种线性关系 必须保证每个子节点的序号小于父子节的序号,这样相减也符合

 

其实到这里这道题就没什么问题了,下面的都是思想实现过程

此类只需保证 1.子节点的序号比父节点的序号小

压缩路径注意改变与父亲的关系

 

 

#include<stdio.h>/carefly
#include<string>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<stdlib.h>
#define N 200110
using namespace std;
int father[N],relat[N],sum;//sum声明成全局变量保证在下面更新父子关系时 关系值的变化
void up_date(int n)
{
    for(int i=0;i<=n;i++)
    {
         father[i]=i;
         relat[i]=0;
    }
}
int _find(int x)//找根//压缩路径//找到关系//线性压缩
{
    int team;
    if(father[x]==x)
        return x;
    team=_find(father[x]);//最终节点
    sum=sum+relat[x];//向量关系计算
    father[x]=team;//压缩路径
    relat[x]=sum;//改变与父节点的relat值量
    return team;
}
int main()
{
    int n,m,p,q,summ,root1,root2,ans,mod;
    while(~scanf("%d %d",&n,&m))
    {
    up_date(n);
    ans=0;
    for(int i=1;i<=m;i++)
    {
        scanf("%d %d %d",&q,&p,&summ);//注意q<=p;
        q--;//这里我把q看作起点
        sum=0;
        root1=_find(q);
        sum=0;
        root2=_find(p);
        if(root1!=root2)//合并集合 //注意小的要并到大的上面
        {
            if(root1<root2)
            {
                father[root1]=root2;
                relat[root1]=summ+relat[p]-relat[q];
            }
            else
            {
                father[root2]=root1;
                relat[root2]=relat[q]-summ-relat[p];
            }

        }
        else//判断是否合理
        {
            mod=relat[q]-relat[p];
            if(summ!=mod)//no合理
                ans++;

        }
    }
    printf("%d\n",ans);
    }
}

这道题上面没说多组输入,但是只能多组输入才能过

 

参考的博客:

http://blog.csdn.net/backforward/article/details/51889011
 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本火锅店点餐系统采用Java语言和Vue技术,框架采用SSM,搭配Mysql数据库,运行在Idea里,采用小程序模式。本火锅店点餐系统提供管理员、用户两种角色的服务。总的功能包括菜品的查询、菜品的购买、餐桌预定和订单管理。本系统可以帮助管理员更新菜品信息和管理订单信息,帮助用户实现在线的点餐方式,并可以实现餐桌预定。本系统采用成熟技术开发可以完成点餐管理的相关工作。 本系统的功能围绕用户、管理员两种权限设计。根据不同权限的不同需求设计出更符合用户要求的功能。本系统中管理员主要负责审核管理用户,发布分享新的菜品,审核用户的订餐信息和餐桌预定信息等,用户可以对需要的菜品进行购买、预定餐桌等。用户可以管理个人资料、查询菜品、在线点餐和预定餐桌、管理订单等,用户的个人资料是由管理员添加用户资料时产生,用户的订单内容由用户在购买菜品时产生,用户预定信息由用户在预定餐桌操作时产生。 本系统的功能设计为管理员、用户两部分。管理员为菜品管理、菜品分类管理、用户管理、订单管理等,用户的功能为查询菜品,在线点餐、预定餐桌、管理个人信息等。 管理员负责用户信息的删除和管理,用户的姓名和手机号都可以由管理员在此功能里看到。管理员可以对菜品的信息进行管理、审核。本功能可以实现菜品的定时更新和审核管理。本功能包括查询餐桌,也可以发布新的餐桌信息。管理员可以查询已预定的餐桌,并进行审核。管理员可以管理公告和系统的轮播图,可以安排活动。管理员可以对个人的资料进行修改和管理,管理员还可以在本功能里修改密码。管理员可以查询用户的订单,并完成菜品的安排。 当用户登录进系统后可以修改自己的资料,可以使自己信息的保持正确性。还可以修改密码。用户可以浏览所有的菜品,可以查看详细的菜品内容,也可以进行菜品的点餐。在本功能里用户可以进行点餐。用户可以浏览没有预定出去的餐桌,选择合适的餐桌可以进行预定。用户可以管理购物车里的菜品。用户可以管理自己的订单,在订单管理界面里也可以进行查询操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值