题解 CF2164F1 Chain Prefix Rank (Easy Version)

· · 题解

F. Chain Prefix Rank

其他题。

鉴于笔者也没学过这种高科技,本题解简述广义串并联图的基础,所以不用担心看不懂。

题意

给定一棵 n 个点的树和一个长度为 n 的数组 a,求有多少长度为 n 的排列 p,满足对于每个 u 恰有 a_u 个祖先 v 使得 p_v<p_u。答案对 998244353 取模。

数据范围:

做法

看了无数篇 blog,所以没法列举出处了,因为我也不知道我在默写哪篇。如果你发现我大篇幅默了某篇你可以来找我。

这里讲官解做法。

我们引入广义串并联图的概念。

广义串并联图基础

定义

如果一个无向图中不存在四个点,使得这四个点间两两有路径相连,且路径间互不相交,则这个图被称为广义串并联图。树和仙人掌是常见的广义串并联图。

构造

性质与判定

口诀:删一缩二并重边。

即广义串并联图可以经过若干次下面三种操作变成一个点:

上述性质也可以用于判定。

上述性质中,由于这些操作通常容易合并信息,我们在操作的过程中可以在点上和边上维护信息以方便地进行统计。

更一般地,对于点数和边数相差较小的图,对其也进行上面的操作直至无法操作,可以将其剩余的点数和边数缩到可以暴力的范围,这种方法叫广义串并联图方法。设 m-n=k,则最终得到的图有 n\le 2k,m\le 3k

本题

首先 a_i 实质上就是 i 在其到根路径上的 rank。

所以为了找到排列我们可以考虑从根向下不断地在当前路径上插入点。我们建一张表示这个关系的图,为了确保每个点都能插入,我们在 1 的上方建立点 n+1,在 n+1 的上方建立点 0,则此时初始的图就是一个 0\to n+1 的边。插入点 1 时,增加 0\to 11\to n+1 的边。然后每次插入新的点时,由于我们已经知道了其 rank,所以我们可以找到其前驱和后继,这样就可以类似于点 1 的插入,每次插入前驱到自己和自己到后继的边。

这样得到的图视为无向图后显然是一个广义串并联图(因为插入的点可以“缩二度点”后“合并重边”来删掉),题目要求其拓扑序个数。很多题解里这里直接给的总式子,我简单展开一下。我们在边上维护信息,下设 f_{x,y} 为边 (x,y) 中包含的方案数,sz_{x,y} 为边 (x,y) 中包含的点数。

上述过程暴力实现是 n^2 的,平衡树维护一下前驱后继可以 1\log