2022 杭电多校day7 1007 Darnassus

 

这道题真的卡常卡得我心累

两两点之间建边的代价是( i - j ) * ( pi - pj ),且pi是一个全排列

求最小生成树

 

#

首先找到一组合法的解,对 i 和 i+1 建边

得到的每条边权值会<=N-1

由此我们得到启发,最后的最小生成树,必然也存在一颗所有边权都<=N-1的

这是因为如果我们嫌弃两点之前边权太大,可以把这两个点拆下来,对于两点中的每一点,逐个找到最小的,然后取min

不断地迭代最后就得到最小生成树

因此边权>n的边是无效的,且<=N-1的边条数较少

且必须满足( i - j )或者 ( pi - pj )<= sqrt(N-1) 我们可以在O(N*sqrt(N) )的时间内找到

并且在实现的时候要注意:

使用邻接表存边,不然会t;(本来时间就很危险,再加一个排序的N*logN会超时

用pos[ i ] 记录 下标为 Pi 时 ,所在的位置,for循环时同时计算( i - j )和 (Pi - Pj )两种情况

 

posted @ 2022-08-11 21:33  liyishui  阅读(39)  评论(0编辑  收藏  举报