2023NOIP A层联测6 万花筒

2023-10-08 17:28
文章标签 联测 2023noip 万花筒

本文主要是介绍2023NOIP A层联测6 万花筒,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目大意

有一张有 n n n个点 m m m条边的无向带权图 G G G,小艾将它放到一个万花筒中观察。在万花筒中,对于每条边 ( u , v , w ) ∈ G (u,v,w)\in G (u,v,w)G,会在 H H H中生成全体 ( ( u + 1 ) m o d + 1 , ( v + i ) m o d n + 1 , w ) ((u+1)\bmod+1,(v+i)\bmod n+1,w) ((u+1)mod+1,(v+i)modn+1,w)的边,最后的图 H H H就是在万花筒中看到的图。

求这个图 H H H的最小生成树的权值和,保证生成树存在。

T T T组数据。

1 ≤ T ≤ 100 , 1 ≤ n , w ≤ 1 0 9 , ∑ m ≤ 1 0 5 1\leq T\leq 100,1\leq n,w\leq 10^9,\sum m\leq 10^5 1T100,1n,w109,m105


题解

对于 G G G中的每一条边 ( u , v , w ) (u,v,w) (u,v,w),令 k = ( u − v + n ) % n k=(u-v+n)\% n k=(uv+n)%n,则在 H H H中,任意两个满足 ( i − j + n ) % n = k (i-j+n)\% n=k (ij+n)%n=k的两个点 i , j i,j i,j都有一条权值为 w w w的边。那么,对于 G G G中的每一条边 ( u , v , w ) (u,v,w) (u,v,w),我们记其对应的 H H H中的边集为 T ( k , w ) T(k,w) T(k,w)

利用 Kruskal \text{Kruskal} Kruskal算法的思想,我们将这些边集按 w w w从小到大排序,并依次遍历以构建最小生成树。

设当前的 n n n个点中没有任何两个点有连边,当前枚举到的边集为 T ( k , w ) T(k,w) T(k,w),则将 n n n中所有满足 ( i − j + n ) % n = k (i-j+n)\% n=k (ij+n)%n=k且不在同一个连通块的两个点 i , j i,j i,j连一条边。那么,这 n n n个点就会分为 d = gcd ⁡ ( n , k ) d=\gcd(n,k) d=gcd(n,k)个连通块,且同一个连通块中的点的编号模 d d d后的值一定相等(可以自己举几个例子试一下)。

这样的话,这个图就连上了 n − d n-d nd条边,边集 T ( k , w ) T(k,w) T(k,w)对答案的贡献为 ( n − d ) × w (n-d)\times w (nd)×w

再考虑下一组边集 T ( k ′ , w ′ ) T(k',w') T(k,w),类似地,将 n n n中所有满足 ( i − j + n ) % n = k ′ (i-j+n)\% n=k' (ij+n)%n=k且不在同一个连通块的两个点 i , j i,j i,j连一条边。这时,我们发现, i i i所在的连通块中的点模 d d d后的值均为 i % d i\%d i%d j j j所在的连通块中的点模 d d d后的值均为 j % d j\% d j%d,那么我们可以将 i i i j j j连边看作 i % d i\% d i%d j % d j\% d j%d连边( i % d i\% d i%d j % d j\% d j%d的值为 0 0 0时将其值看作 d d d),这样显然是等价的。

换句话说,我们将每个连通块都看成了一个点,而这个点表示的连通块就是一棵树。

那么,在连完 T ( k , w ) T(k,w) T(k,w)的边之后,问题可以看作剩下 d d d个点且其中没有任何两个点有连边,要求其在连上剩下的边集后的最小生成树的权值和。

每次多加一个边集,就按上面所说的操作一次,并算上边的贡献。因为保证生成树存在,所以最终一定只剩下一个点,而这一个点所表示的连通块就是图 H H H的最小生成树。

将每次操作的贡献求和,即可得到答案。

时间复杂度为 O ( m ) O(m) O(m)

code

#include<bits/stdc++.h>
using namespace std;
int T,n,m,now,d;
long long ans;
struct node{int t,w;
}v[100005];
bool cmp(node ax,node bx){return ax.w<bx.w;
}
int gcd(int i,int j){while(j){i%=j;swap(i,j);}return i;
}
int main()
{freopen("kaleidoscope.in","r",stdin);freopen("kaleidoscope.out","w",stdout);scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);for(int i=1,x,y,z;i<=m;i++){scanf("%d%d%d",&x,&y,&z);v[i].t=(x-y+n)%n;v[i].w=z;}sort(v+1,v+m+1,cmp);now=n;ans=0;for(int i=1;i<=m;i++){d=gcd(now,v[i].t%now);ans+=1ll*(now-d)*v[i].w;now=d;}printf("%lld\n",ans);}return 0;
}

这篇关于2023NOIP A层联测6 万花筒的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/166854

相关文章

YOLOv4重磅发布,五大改进,二十多项技巧实验,堪称最强目标检测万花筒

点击上方蓝色字体,关注我们 今年2月22日,知名的 DarkNet 和 YOLO 系列作者 Joseph Redmon 宣布退出 CV 界面,这也就意味着 YOLOv3 不会再有官方更新了。但是,CV 领域进步的浪潮仍在滚滚向前,仍然有人在继续优化 YOLOv3。今日,著名的AlexeyAB版本发布了 YOLOv4的论文。该论文提出了五大改进,二十多个技巧的实验,可以说 YOLOv4是一项非

【Java万花筒】物联网安全库大全:保护你的物联网设备和应用程序

构建安全无忧的物联网:利用Java库保护你的设备和应用程序 前言 随着物联网的快速发展,越来越多的设备和应用程序连接到了互联网。然而,物联网的安全性问题也引起了人们的关注。保护物联网设备和应用程序的安全性对于个人隐私和信息安全至关重要。为了帮助开发人员构建更安全的物联网系统,我们提供了一个综合性的物联网安全库大全,其中包括了一些常用的物联网安全库及其特点、功能和示例用法。 欢迎订阅专栏:J

【Java万花筒】多因素身份验证库:Java 开发者必备工具

使用多因素身份验证库保护您的应用程序 前言 随着互联网应用程序的不断发展,身份验证已经成为保护用户数据和资源的关键环节之一。传统的用户名和密码验证方式已经无法满足安全性要求,因此多因素身份验证成为了必要之选。在本文中,我们将介绍几种流行的多因素身份验证库,包括 Google Authenticator Java、Authy Java、Duo Java、Spring Security 和 Apa

【Java万花筒】探索Java人脸表情识别世界:SDK与库详尽比较与选择指南

探索人脸表情识别:Java SDK 和库全面比较 前言 在当今数字化世界中,人脸表情识别技术正变得越来越重要。它不仅在娱乐、游戏和社交媒体等领域发挥作用,还在安全、医疗和用户体验等方面有着广泛的应用。本文将探讨几种流行的 Java SDK 和库,以帮助开发人员选择适合其项目需求的最佳工具。 欢迎订阅专栏:Java万花筒 文章目录 探索人脸表情识别:Java SDK 和库全面比

【Java万花筒】高效实现人体姿态估计与动作识别:探索人体姿态估计与动作识别的黑科技

人体姿态估计与动作识别库 前言 人体姿态估计和动作识别是计算机视觉领域的重要研究方向,它们在许多实际应用中发挥着重要作用。通过对人体姿态和动作的准确分析,我们可以实现人机交互、运动训练、姿态评估等多种应用。本文将介绍几个常用的Java库,包括OpenPose、DeepPose、JavaCV、Dlib和TF Pose Estimation,它们都是优秀的人体姿态估计和动作识别库,可以帮助开发者快

【Java万花筒】畅览实时数据的奇妙世界:Java库与框架应用指南

高性能实时数据处理利器:Java流处理框架全解析 前言 随着大数据技术的迅速发展,对于实时流数据的处理和分析需求也日益增加。复杂事件处理和流式数据分析成为了解决实时数据处理挑战的关键技术。本文将引导读者探索Java领域的一些重要库和框架,以帮助读者更好地处理和分析实时事件流和流式数据。 欢迎订阅专栏:Java万花筒 文章目录 高性能实时数据处理利器:Java流处理框架全解析前

【Java万花筒】从开发到测试:嵌入式数据库与键值存储库全方位指南

嵌入式数据库与键值存储库:探索高效数据存储和访问的先进工具 前言 在当今数字化时代,数据的存储和访问是任何应用程序的关键需求。为了满足不同的需求,开发人员需要选择适合其应用场景的数据库和存储库。本文将介绍一些常用的嵌入式数据库与键值存储库,以及它们的特点、用途和主要功能。我们将深入探讨 H2 Database Engine、Apache Cassandra、Redis、Berkeley DB、

【Java万花筒】科学的交织之舞:实验室管理系统与数据分析工具的默契合作

实验室管理系统与数据分析的完美融合:解锁科学研究的新可能 前言 在现代科学研究中,实验室管理系统起着关键的作用,帮助科学家和研究人员有效地管理实验室数据和实验过程。然而,仅仅将数据存储在实验室管理系统中是不够的,科学家还需要对实验数据进行分析和处理,以获得有价值的信息和洞见。因此,将实验室管理系统与数据分析工具和平台进行整合和扩展,变得至关重要。本文将介绍几种常用的工具和平台,包括LabKey

【Java万花筒】跨越云平台的无服务器开发:使用Java构建弹性、高效的应用

无服务器计算平台的Java集成指南:AWS Lambda、Google Cloud Functions、腾讯云函数和IBM Cloud Functions 前言 无服务器计算平台提供了一种方便、弹性和成本效益高的方式来运行代码,而无需关心底层基础设施的管理。在这篇文章中,我们将探讨如何使用Java语言与一些主要的无服务器计算平台集成,包括AWS Lambda、Google Cloud Func