首页 > 其他分享 >[题解]ABC282E Choose Two and Eat One

[题解]ABC282E Choose Two and Eat One

时间:2024-04-18 22:48:22浏览次数:24  
标签:return int 题解 ABC282E Two fa Choose fac

ABC282E Choose Two and Eat One

又一个图论的回顾——Kruskal最小(最大)生成树算法。

看到\(n\)的范围只有\(500\),应该没有什么特别的算法。那么我们考虑建一个*\(n\)个顶点的完全图,节点\(x\)到节点\(y\)的边权值就是\(x^y+y^x\)。然后跑一遍最大生成树,得到的和就是最大结果了。

如何证明生成树的边一定满足题目条件?因为一共要吃掉\(n-1\)个球,也就是删除图上的\(n-1\)条边,若想让这\(n-1\)条边连接\(n\)个点,必须要求这些边构成一个树。

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct edge{
	int u,v,w;
}edges[250010];
int n,m,a[510],fa[510],cnt;
bool cmp(edge a,edge b){return a.w>b.w;}
int find(int x){
	if(fa[x]==x) return x;
	return fa[x]=find(fa[x]);
}
int qpow(int a,int b){
	int fac=1;
	while(b){
		if(b&1) fac=(fac*a)%m;
		a=(a*a)%m,b>>=1;
	}
	return fac;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			edges[++cnt].u=i,edges[cnt].v=j;
			edges[cnt].w=(qpow(a[i],a[j])+qpow(a[j],a[i]))%m;
		}
	}
	sort(edges+1,edges+1+cnt,cmp);
	for(int i=1;i<=n;i++) fa[i]=i;
	int edgecnt=0,ans=0;
	for(int i=1;i<=cnt;i++){
		int u=find(edges[i].u),v=find(edges[i].v);
		if(u==v) continue;
		fa[u]=v;
		edgecnt++;
		ans+=edges[i].w;
		if(edgecnt>=n-1) break;
	}
	cout<<ans;
	return 0;
}

标签:return,int,题解,ABC282E,Two,fa,Choose,fac
From: https://www.cnblogs.com/Sinktank/p/18144676

相关文章

  • RuntimeError: No CUDA GPUs are available问题解决
    RuntimeError:NoCUDAGPUsareavailable问题解决检查GPU是否可用importtorchiftorch.cuda.is_available():print("GPU可用")else:print("GPU不可用")显示当前可用的GPU数量importtorchprint("当前可用的GPU数量:",torch.cuda.device_count())P......
  • [题解]CF33C Wonderful Randomized Sum
    CF33CWonderfulRandomizedSum我们可以发现,如果两区间不交叉也不会影响到结果,所以我们只需要考虑不交叉的情况即可。我们所选择的前缀\(1\simi\)应满足区间和最小,后缀也一样。所以用两个数组\(lr,rl\)分别记录下\(1\simi\)(前缀)最小和、\(i\simn\)(后缀)最小和。然后枚举分割......
  • 问题解析
    查看内存总量[root@localhost~]#free-h----人性化显示内存使用情况totalusedfreesharedbuff/cacheavailableMem:1.8G329M270M9.1M1.2G1.2GSwap:4.0G0B......
  • [ABC240E] Ranges on Tree 题解
    [ABC240E]RangesonTree题解思路解析由题意可知,只要一个点的所有儿子节点都被确定了,那么当前节点也就被确定了。也就是说,只要确定了所有叶子节点,也就能一层层地确定所有节点,而叶子节点没有儿子节点不受此条件的约束,同时我们希望\(\max\limits^N_{i=1}R_i\)最小,所以我们把所......
  • 【面试准备】跨域问题解决方法
    跨域是什么浏览器对于javascript的同源策略的限制,是一种安全策略举例:用户登陆某个网站后,服务器在客户端写了一些cookie,如果cookie被其他网站读取,那么隐私信息就会泄漏,包含用户的登录状态等。跨域情况说明:域名不同域名相同,端口不同二级域名不同跨域问题解决jsonpngi......
  • P7177 [COCI2014-2015#4] MRAVI 题解
    思路。我们知道最初添加的液体越多,那么每个蚂蚁得到的液体也就越多,又因为标签里有深搜,所以可以用DFS+二分解决(感觉说了一通废话),算是比较常规的一种解法了。在此题中我们需要魔改一下建树,需在其中添加判断此边是否为超级管道和处理通过液体的百分比这两段代码。DFS和二分的代......
  • Multiplicity 题解
    \(\texttt{ProblemLink}\)简要题意给定一个序列\(a\),求\(\sum\limits_{i=1}^ncnt_i\)。\(cnt_i\)表示在\(a\)中选择长度为\(i\)的非空子序列\(b\)使得\(\forallj\in[1,i],j|b_j\)的数量。思路计数题,考虑dp。设\(f_{i,j}\)表示前\(i\)个数,选......
  • [题解][洛谷P1174] 打砖块
    题目分析n行m列的砖块,起始有k发子弹。每次可以用一发子弹,打碎某一列当前处于这一列最下面的那块砖,并且得到相应的得分。某些砖块打碎以后会获得一个砖块。求最大得分。题解可以看出是一道动态规划题。关键在于如何设计状态。先考虑砖块打碎不会得到子弹的情况:这个时候可以......
  • [题解] [NOIP 1999] 导弹拦截
    [NOIP1999]导弹拦截题目描述有若干枚导弹,每一枚导弹的高度是\(h_i\),导弹拦截系统每次拦截导弹都不能比上一次拦截的高度更高,导弹拦截没有冷却时间且第一次拦截的高度任意。问题1:一套系统最多能拦截多少导弹?问题2:拦截所有导弹最少需要多少个拦截系统?输入格式一行,若干个......
  • LibreOJ-3038 「JOISC 2019 Day3」穿越时空 Bitaro <线段树> 题解
    审题一条链每条边有通行时间上下界限制通过一条边需要\(1\)单位时间站在当前节点时间减少\(1\)耗费\(1\)单位代价\(q\)次询问要么更改一条边的通信时间上下界要么询问在\(b\)时刻在城市\(a\),\(d\)时刻到达城市\(c\)的最小代价思想做题准备......