【做题笔记】NOI2023 D2T1

0x3b800001 / 2023-07-27 / 原文

Problem

一个共 \(n\) 层的内向满二叉树,给定 \(m\) 个前向边(即往子树走的边),边有非负权,问所有可以从 \(u\) 通向 \(v\) 的点对 \((u,v)\) 的最短路长度之和。\(n\le18\)\(m\le2\times10^5\)

Preface

D1T1 是我基本上独立想出的,这个题是补的。

我也想拿牌子。

Solution

考虑一个点 \(u\) 通向 \(v\) 的方式。

如果 \(v\)\(u\) 的子树内,那么显然只会走子树里面的边走到。

否则,可以证明是先从 \(u\) 走到 \(fa_u\),再走 \(fa_u\)\(v\) 的最短路。

第一种是好处理的。对于每个点 \(u\) 在其子树内跑 Dijkstra。下证明复杂度。

首先 Dijkstra 的复杂度为 \(O(|E|\log|V|+|V|)\)。由于 \(|E|\) 可能很小,所以后者不能忽略。对于距离根为 \(0\le i<n\)\(2^i\) 个点,所有 \(|E|\) 的和显然是 \(\le m\) 的,而 \(|V|=2^{n-i}-1\),则 \(\sum(|E|\log|V|+|V|)<\sum\limits_{i=0}^{n-1}m(n-i)+2^{n-i}\cdot 2^i=O(n2^n+nm)\)。所以这一部分复杂度为 \(O(n2^n+nm)\)