pta 绍兴文理 并查集

学长们举办了一次ACMer聚会,但每个人需要带两件价格不同的小礼品,参加聚会的一个游戏。

      游戏的规则:

1.每个人选择一个朋友或者选择自己,每个人事先不知道其他人的礼物价格。

2.每个人和他所选择的人进行组队,共享每个人的小礼品。同时,如果a选择b组队了,b选择c组队,那么a,b,c为一个队伍

3.每个团队的最昂贵小礼品和最便宜的小礼品的差价之中 最大的,获得举办方的最终大礼品

现在,学长需要知道这个价格的差价最大是多少

输入格式:

第一行输入一个整数 n ( [1,1e5] )

接下来输入 n 行,输入三个整数 a( [1,n] )b,c( [1,1e9] )

每行表示第 i 行的人(标记为 i -1 号) 第 i 行的人和 a 号(第a+1 行)的人组队,b,c是礼物的价格

输出格式:

输出团队的最大差价

输入样例:

样例一

5
1 1 2
2 1 3
3 1 4
4 1 5
5 1 6

输出样例:

5

样例一解释

第二行的1号选择了1号(就是选择自己),以此类推

都是自己跟自己组队,5号是差距最大的,相差5

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,k,x,y,ans,stand;
ll f[100010],u[100010],l[100010];
int find(int x)
{
    if (x!=f[x])
        f[x]=find(f[x]);
    return f[x];
}
int main()
{
    cin>>n;
    for (int i=1; i<=n; i++)
        f[i]=i;
    memset(u,0x3f,sizeof(u));
    memset(l,-1,sizeof(l));
    stand=u[1];
    for (int i=1; i<=n; i++)
    {
        cin>>k>>x>>y;
        int p1=find(i);
        int p2=find(k);
        if (p1==p2)
        {
            l[p1]=max(max(l[p1],x),y);
            u[p1]=min(min(u[p1],x),y);
        }
        else
        {
            f[p2]=p1;
            l[p1]=max(max(max(l[p1],x),y),l[p2]);
            u[p1]=min(min(min(u[p1],x),y),u[p2]);
        }
    }
    for (int i=1; i<=n; i++)
        if (u[i]!=stand&&l[i]!=-1)
            ans=max(ans,l[i]-u[i]);
    cout<<ans;


}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值