华南理工大学“三七互娱杯”程序设计竞赛 G 并查集

https://ac.nowcoder.com/acm/contest/874/G

题意:定义树上任意两点间的权值是经过边权的最大值,求图上任意两点间的权值和

解:每一条边的贡献最多到左右比这条边权值还大的这些点,因此最小的边左右只有2个点(有贡献),

边权排序后,先加小的边,计算联通块大小,贡献为w*val[l]*val[r], 并查集维护联通块大小。

数据好像挺大的,__int128学一学

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t;
int n;
struct edge{
	ll u,v,w;
}a[1000005];
bool cmp(edge a,edge b)
{
	return a.w<b.w;
}
int pre[1000005];
int val[1000005];
__int128  ans;
int find(int x)
{
	if(x==pre[x])
		return x;
	else
		return pre[x] = find(pre[x]);
 } 

void scan(__int128 &x)
{
    x = 0;
    int f = 1;
    char ch;
    if((ch = getchar()) == '-') f = -f;
    else x = x*10 + ch-'0';
    while((ch = getchar()) >= '0' && ch <=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值