学长们举办了一次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;
}