数数
P10881
额三次方过 1000,数据不好评价,但是题目是神仙题。有一定技巧性,我做不出来就是了。不知道场上写出多项式做法的都是什么神仙。
大概是个矩阵树是吧,但是是基环树。就是基环树要么破环为链,要么缩环为点。那破环会算重,然后容斥也不知道有没有前途。考虑缩点。
那首先可以暴力枚举环所在的集合,然后剩下来的矩阵树。
优化从矩阵树的行列式计算开始。记 \(sum:=\sum_{i=1}^n a_i\)。
考虑 Laplace 矩阵的主子式,不妨撇掉缩点所在的一行一列。注意到邻接矩阵很特殊,任意三行线性相关。那考虑对主子式做低秩矩阵分解,分出来的邻接矩阵 \(A\) 只可能以小于等于两行的数量替换到 \(D\) 里面去。
然后这个 \(D\) 只在主对角线有值。所以替换之后的矩阵的行列式是好算的。
现在我们发明了平方计算行列式。具体地,可能会出现 \((na_i-sum),a_i,a_i^2,a_ia_j\) 这些因子。
考虑优化。瓶颈显然在环的枚举上。用一个 DP 统一计算贡献。
考虑环的贡献形式:\((a_1+a_2)(a_2+a_3)\dots(a_n+a_1)\)。显然每个 \(a_i\) 只会贡献 \(0/1/2\) 次幂,然后 \(0\) 和 \(2\) 次幂的个数是相等的。
(可以理解为,每个括号中取因子,可以看做给边定向,入度就是贡献次数。这样的小巧思多来点。)
通过这个小巧思,可以看出,设 \(0/1/2\) 次幂的分别取了 \(a,b,c\) 个,那么能构成的环的个数就是后面忘了。可以理解是,往长为 \(a\) 的圆排列里面,在 \(a\) 个空隙中插入 \(c\) 个元素(\(a\ne c\) 时答案自然是 \(0\)),每个空隙恰插入一个。然后再在 \(2a\) 个空隙中插入 \(b\) 个元素,允许空。然后钦定顺序。(推这个一定要快!)
然后 DP 的时候弄一个 \(f_{i,a,b,c,p,q}\) 表示,前 \(i\) 个,钦定了 \(a,b,c\) 个 \(0/1/2\) 次幂的环内元素,钦定了 \(p,q\) 作为行列式中替换集合。然后这个 \(p,q\) 是不需要记的因为可以多开 \(O(1)\) 维表示平方项的贡献,或者,我钦定 \(q\) 之前得钦定 \(p\) 吧,那钦定的时候直接在这个基础上乘就好了。
那现在有四次方做法了。好写吗?好像还行。
继续优化。考虑我们为什么要记录 \(a,b,c\),还不是为了最后统计答案的时候算贡献系数。
那我们假如只知道全局的 \(0/1/2\) 次幂的个数,可不可以直接算系数?
可以的。注意到,环外部分的贡献,也可以写成关于 \(a_i\) 的 \(0/1/2\) 次幂的单项式(视 \(sum\) 为常数,即系数的一部分)的和。那我们只需要把每个这样的单项式的系数算出来就好了。
然后注意到由上面的分析,\(a,b,c\) 相同时(这里的 \(a,b,c\) 是全局的 \(0/1/2\) 次幂的个数),系数是相同的。好搞。因为这里 \(a,b,c\) 统计的是全局的个数,所以 \(a+b+c=n\),又去掉了一维。复杂度三次方。
P4548
额想不到就是想不到吧。不亏。因为这个东西叫做概率生成函数。
咕?
考虑答案就是一个在 KMP 自动机上随机游走,从 \(0\) 走到 \(m\)。
设 \(f_i\) 表示从 \(0\) 开始,第一次走到 \(i\) 的期望步数。
那注意到一个事实:对于 \(i<j\),从 \(i\) 出发,沿着转移边第一次走到 \(j\) 的期望步数,就是 \(f_j-f_i\)。(这样的注意到。能不能在我身上发生一点!!!!)
原因很简单,因为走到 \(j\) 必须先走到 \(i\)。
那考虑如何递推,考虑 \(i-1\) 到 \(i\) 的路径长什么样子。大概就是,一步到位,或者绕回去了。$$f_i- f_{i-1}=\frac 1n + \sum_{c \ne s_i}\frac{1+f_{i}-f_{trans(i-1, c)}}n$$
拆开就是
记后面一个求和式为 \(g_{i-1}\)。那显然转移边的意义就是,我这一位失恋了,要往前面找。所以自然地,\(g_i\) 可以从 \(g_{fail_i}\) 转移来。转移讨论一下当前字符取不取 \(s_i\),是平凡的。(着重注意 fail 的定义)
时间复杂度 \(O(m)\)。
(这题还有一个结论,答案就是 \(\sum_{i} [i=n\text{ or }i \text{ is border}]n^i\)。我能证明她吗?)
P10004
我草为什么你们都说是人均题。【好像确实是?我是猫猫做不出来就?喵。】
先想一个限制(忽略逆排列)怎么做。这个我有这个思考方向,表扬!
那第一反应容斥对吧,因为之前见过,把一串小于号连成连续段的。那第二反应觉得直接 DP 更有道理就没管容斥了,差评。(这个坏的原因是不能拓展到逆排列的限制)
考虑钦定 \(S\) 集合内的小于号成立,其他任意,那就有 \(n-|S|\) 个连续段,然后怎么调一下容斥系数,每段的权值视为 \(\frac{1}{-l_i!}\) 啥的。然后对 \(|S|=k\) 求和,就会多出来一个组合数。
(这好像被称作,连续段二项式反演?)
那考虑二维的怎么做。容斥套容斥。然后逆排列的话,直观一点可以把 \((i,p_i)\) 放在二维平面上。
那仍然是钦定 \(i\) 个 \(p\) 上的连续递增段,\(j\) 个 \(p^{-1}\) 上的连续递增段。那这个可以看做把二维平面画成了 \(i\times j\) 的网格。
这样钦定完,如果确定了每个格子里面落了多少个点,那么可以唯一确定这个排列 \(p\)。
(额讲道理这个不是重要的。权值不是 \(1\) 的,怎么 DP 一下是不是还能算。但是我觉得最有说法的是容斥硬做啊。积累一点是一点)
满射和单射的证明,画个图都不难感知。
那也就是说求的东西等价于,\(i\times j\) 的矩形网格,里面填数,要求每行、每列的和都大于 \(0\),总和为 \(n\),求方案数。
那这个东西继续容斥。剩下来的就是机械的二反。复杂度的话,稍微去除一点重复运算,三方是不困难的。
ARC148E
牛牛题。见一次就记住吧这种东西。
考虑 DP。考虑不了一点。因为状态中没有办法刻画“相邻和”的限制。你容斥也不像“连续段容斥”那样能把权值写的干爽。
那排列计数还有个思路就是,考虑一个个把数插入进去。然后我们通过一个合适的插入顺序,使得每次插入带来的系数都是一样的。即,不会随我这一次插入位置的不同而改变。
那么一个可行的方案是,每次考虑最小数 \(a\) 和最大数 \(b\),若 \(a+b\ge k\),则插入 \(b\);否则插入 \(a\)。每次的系数就是,当前“空位数量”。
考虑证明。将数分成 \(\ge \frac k2\)(大数)和 $<\frac k2 $(小数)两类。那大数和大数相邻一定合法,小数和小数相邻一定不合法。
“空位数量”,就是大数和大数相邻的组数。
考虑到我这个插入方案,插入了小数之后,后面所有数(不论大小)都不能和她相邻。插入了大数之后,所有数都能和她相邻。那么正确性是容易看出的。
然后插入一个大数,总是会使空位数量加一;插入小数则减一。
这样构造的由头在于。在于啥啊就纯灵光一闪吧。
最后给相同数去序。
接下来讲讲连续段 DP / 线头 DP / 插入 DP(爱怎么叫怎么叫吧)。
P9197
超级经典的题。
那么我自己发明了个连续段 DP,钦定当前有 \(j\) 个能往下接的递增连续段,然后数字按照值域从大到小插入,每次只能插在连续段下面或者新开一段。
那么这个假飞了,因为
我不能在连续段的中间插入元素,因为没办法统计代价。
那么钦定递增是毫无意义的。讲正经的连续段 DP。
考虑当前有 \(j\) 个连续段,那么我新进来一个元素,可以:
- 新开一段,可以在 \(j+1\) 个空隙中任选。
- 续在任意一段的首尾。这个特性就方便了我们统计代价。
- 合并某两段。
设 \(f_{j,k}\) 表示 \(j\) 个段,总代价为 \(k\) 的方案数。去掉绝对值自然给 \(a\) 先排序。我是降序的。
那么这题中,具体地,需要多开两维 \(0/1\) 处理两端的 \(a_i\) 有没有被提前加上。转移的时候讨论一下就好。
那有个问题。因为我们给拆贡献了,所以 \(k\) 可能达到 \(\sum a_i\) 量级,无法接受。然后这里借一张图(源自文章,感谢):
更改 \(k\) 的定义为线头的长度。那么 DP 的时候每个时刻,\(k\) 都是 \(O(L)\) 的。总复杂度 \(O(n^2L)\)。
当然这还有一种理解方式,是通过拆式子,再把 \(k\) 的贡献分配到 \(a_i\) 的差分数组上去,我不会。
P5999
也是经典题。
那么这个题不太能直接容斥(当然有我不懂的爆标做法),原因是,首尾 \(s,t\) 在容斥的时候,不能直接通过钦定的连续段长度得到权值。
那这个题限制是相邻两个元素的,线头 DP 随便做。
具体地,设 \(f_{i,j,0/1,0/1}\) 表示按值域从大到小做到 \(i\),有 \(j\) 段,首尾能不能放。那么 \(i\ne s,i\ne t\) 的时候,我可以新开一段,也可以合并段。但是在段后面续上是不合法的,想想也容易理解。
然后 \(i=s\) 的时候,我钦定让她放在最前面。这时候可以新开一段,也可以视为续在了第一段前面。然后把头部锁死,不能再在这里新开段。\(i=t\) 同理。
时间复杂度 \(O(n^2)\)。
P7967
那么发现相邻磁铁的限制就是充要的。那考虑线头 DP,从小到大插入磁铁,然后在续上和合并的时候,枚举一下有多少个空位塞在她们中间就行。这个过程可以用前缀和优化。总复杂度 \(O(n^2l)\)。
吗的模数打错了调了 1.5h。
QOJ838
上午刚学的连续段,现在看到这个就不会,草了我吧。
很难想到。我只能说。只能事后诸葛亮,努力拼凑一下思维链。
那么环有什么组合性质。我一开始考虑的是,枚举左部点某个集合 \(S\),右部点某个集合 \(T\),尝试用简单的表达式刻画这两个点集构成环的数量。但是这不仅难搞还会算重。
她前缀连边的特性你没用上啊!
那么考虑环的生成过程。可以认为是一个线头的变种,只不过我最后一步把线头捏在一起了。那么我们通过对点的排序,使得加入点的转移变得方便。
具体地,我们给左右部点排到一起,使得,对于所有排在左部点 \(i\) 前面的右部点 \(j\),\((i,j)\) 有连边。
然后这题可以钦定续上是不合法的(为什么?),钦定新开段只能在左部点处发生,合并段只能在右部点处发生。那么转移是简单的。
答案的话,二元环都是不合法的,减掉就好,然后对于一个环会顺时针逆时针各算一遍,再除以二就好。时间复杂度 \(O(n^2)\)。
ARC213D
神仙题。
那么看到定义自然想,对于一个确定的 \(p\),我怎么算 \(f\) 值。
那么注意到,考虑把一个逆序对的贡献挂在较大的数上。然后这个逆序对存在与否,只需要看较大的数有没有 flip。记 \(i\) 左边比 \(p_i\) 小的数有 \(L_i\) 个,\(R_i\) 同理,所以 \(f=\sum_{i=1}^n \min(L_i,R_i)\)。
然后 \(O(n^4)\) 的做法显然,但是没有一点前途。这里感谢 vegetable_king 的文章。
考虑把逆序对的贡献拆开。先考虑我 \(a_k=v\) 时,\(\min(L_k,R_k)\) 的总和是什么。那么可以视为,枚举 \(L+R=v-1\),数此时符合 \(L,R\) 限制的排列有多少。那么 \(L+R=v-1\) 个小于 \(v\) 的任意排列,然后再插入 \(n-v\) 的元素的全排列就好。容易做到 \(O(n^2)\),分治 FFT 做到两个老哥。
然后考虑 \(\sum_{i\ne k}min(L_i,R_i)\) 的贡献。这部分视为,我对于一个 \(a_k=v\),首先有一部分和 \(a_k\) 无关的贡献,先算出来,到时候给每个 \(ans_v\) 都加上。然后我把 \(a_k=v\) 插入到这 \(n-1\) 个数中,看贡献会怎么变化。
那么她会影响一个 \(a_i=y>v\) 的 \(L/R\)。
我对于每个 \(y\),求出这个贡献 \(b_y\),那么统计答案的时候加上 \(\sum_{y>v}b_y\) 就好。
然后这里神仙的做法是,枚举 \(a_k\) 两侧 \(\le y\) 的值有 \(l,r\) 个(其中显然 \(l+r+1=y\)),我算 \(y\) 可以放在这 \(i+j\) 个位置中的几个。
这里我和上面一样。上面算和 \(a_k\) 无关贡献的时候,枚举每个下标 \(i\) 填什么值,这个 \(i\) 的枚举是无意义的。这里也一样,我枚举 \(y\) 的下标也是无意义的。
那么 \(y\) 的位置在 \(x\) 右边时,只有 \(L_y<R_y\) 才会造成贡献加一,所以大概就是 \(y\) 的位置只有 \(\frac{l+r}2-l=\frac{l-r}2\) 个(下取整)。
左边同理,那么整理一下就是 \(\frac{|l-r|}2\)。一些 corner 也满足。
那么再用熟知的 \(\frac{|l-r|}2=\frac{l+r}2-\min(l,r)\)。由于 \(l+r\) 是常数 \(y-1\),分配律出来,一部分用范德蒙德卷积可以做掉,另一部分和刚开始 FFT 的部分形式一模一样。那么总复杂度 \(O(n\log^2n)\)。
吗的最后分治 FFT 都不会。讲一下吧,大概就是

hitachi2020F
额这题主要有两个难点。
- 首先令猫摸不着头脑的是这个 \(H\) 的合法条件如何刻画。
那么首先 \(H\) 只有一条直径,否则(因为 \(n\ge 3\))可以在另一条直径两端点连边,但另一条直径不减。
那么找出这一个直径 \(s\to t\),考虑 \(s\) 为根的 BFS 树。那么按照 BFS 的深度划分层,\(H\) 每层都应该是个团,而且相邻层的点,两两有连边。(这也太牛了!)
Moreover, 我确定了一个深度数组(\(d\)),就确定了 \(H\)。即构成双射。(这也太牛了!)
然后考虑 \(d\) 合法的充要条件。那么假如确定了一个根,那对于有连边的两个点 \((u,v)\),有 \(|d_u-d_v|\le 1\)。然后 \(d_u\) 不大于该点在原树上的深度的,但这个不重要,严格比前面的条件松。
然后显然有且仅有一个点使得 \(d_u=0\),有且仅有一个点使得 \(d_v=L\)。其中 \(L\) 为直径长度。
那把原树的直径找出来 DP 一遍不就没了。
好这个是第二个难点。
- 原树中合法的直径可能有很多,怎么选根?
(我不知道这是不是 trick 啊,记一下吧。)
所有直径都是经过树的中心 \(x\) 的,所以以树的中心为根。
考虑状态设计,那假如我们钦定“相对 \(x\) 的深度”,那么新直径中,一个端点是 \(d'_s=-\frac L2\),一个端点是 \(d'_t=\frac L2\)。
我们可以钦定一条边为 \(+1/0/-1\),然后设 \(f_{u,0/1/2,0/1/2}\) 表示子树里有几个顶满 max depth 的负深度,有几个顶满 maxdepth 的正深度。
转移类似于树形背包。那么数量 \(\ge 2\) 都等价的,所以记到一起。
还有一个细节,\(L\) 为奇数怎么办。
那取出两个中心 \((U,V)\),往两边分别 DP,最后手动合并就好。
注意答案应当是 \((\sum_{p}f_{U,1,p})\times(\sum_qf_{V,q,1})\) 而不是 \(f_{U,1,0}\times f_{V,0,1}\),因为子树内我即使钦定了一些额外看起来不合法的的顶满的,我都会被 \((U,V)\) 这条边毙掉!(画个图理解吧,说不明白了)
复杂度 \(O(n)\)。
模拟赛题
题意:给定一棵树,在这基础上把每组距离为 \(2\) 的点对用无向边连接起来。求包含点 \(1\) 的简单环个数。(原题要在这个基础上稍作修改)对 \(10^9+7\) 取模。
时间复杂度要求线性。
那么先考虑链怎么做。那注意到我从 \(1\) 往下走,只会有第一次走了一条树边,最后一次走了一条树边,然后再蹦额外边回来。简单处理就好。
考虑树,分类讨论:若第一步走的是树边,则回来一定是走到下面的孙子,再跳回来。
注意到对于某个子树,我只能进入其一次。然后出来时的结构一定是,我走到 \(u\),出来蹦到她的父亲。那对这个结构 DP:设 \(f_u\) 表示从 \(u\) 开始,出去蹦到 \(u\) 的父亲,的方案数。
那么转移是不难的。
- 第一步是 \(u\) 走到儿子:注意到这时候我不可能再往下深入了,不然出不来了。只能横着蹦,再回去。简单组合数算出系数,乘上 \(deg^{\underline 2}\)。(注意这里下降幂的原因是,进来和出去的点,是不对称的。)
- 第一步走到孙子 \(x\):这时候注意到成为了子问题,就要先用到 \(f_x\)。注意出来之后还可以横着蹦。组合数处理一下。
那么有了 \(f\) 值之后,可以仿照转移过程简单算出开头走了一条树边的环的数量。注意
会算两遍。减掉一遍就好。还有一些二元环。
然后考虑 \(1\) 连的两条边都不是树边,的环的数量。
再按照这两个孙子在不在同一个儿子的子树里面分类。
- 在同一子树里:有可能是

也有可能是
简单处理。注意后一种情况,在算系数的时候有一个“插空”的过程,与其它系数稍有不同。 - 不在同一子树里:大概是先在儿子之间蹦,在深入到孙子之间蹦。

细节很多。时间复杂度线性。
CF1264D1/2
好的题意首先是,对于合法的括号串我也可以删东西让她变得更优。
然后对于一个确定的括号串 \(s\),答案显然就是 \(\max_{i}\{\min(a_i, b_i)\}\)。然后对于这种 max min 交错的鬼玩意,如果是最优化问题就去二分了是吧。那计数的时候就也考虑二分转 01(判定)。
考虑我要让答案 \(\ge x\) 的方案数。那么我要取出从左往右第 \(x\) 个左括号,想办法让它右边有至少 \(x\) 个右括号。然后这样也不会算重。
那么 D1 就做完了,组合数做到 \(O(n^2)\) 是 trivial 的。
然后把这个东西拆开一下,考察每一个 \(i\) 对答案的贡献,大概就是
其中 \(a,b,c,d\) 为和 \(i\) 有关的常数。求和上界多大都是无所谓的。
那么运用一个非常困难的公式 \(\binom nm = \binom{n}{n-m}\)。
也就是
等于
然后注意到在 \(i\) 的限定下,\(a+c\) 要么是常数 \(t\),要么是常数 \(t-1\)。然后这个东西就是 \(2^{a+c}\) 减掉一些项。一个数组预处理就好了。时间复杂度 \(O(n)\)。
QOJ7416
小清新题。
考虑正常情况下应该每个点有两个出度,所以答案就是 \(2^n-1\)。\(n\) 为串长。
那什么情况下只有一个出度?显然 border 为 \(len-1\),即该串字符全相等。
那么考虑在这个 \(2^n-1\) 的基础上减去一些值。
考虑最本来是怎么求 \(f_u\) 表示 \(u\) 结尾的路径的。那就是 DAG DP。
可以发现,对于一个点,对于答案的负贡献就是,她原来的 \(f\) 值,乘上她后继的数量。
因为所有字符都相等,所以后继数量自然是 \(len-1\)。现在考虑求 \(f\)。
那假如一个极长相等段是 \([l, r]\),枚举长为 \(len\) 的子段,那我的起始位置可以是 \([l,r-len]\)。对应的删字符的方法数就是一个组合数。
(正确性?)简单的解释是,我现在是在 \(2^n-1\) 的基础上修的过程,目前假设的是,aaaaaaaaaa 删头和删尾是两种不同的方案。
那现在复杂度就是 \(O(n^2)\) 的。然后组合数可以写成一个上指标求和的形式,做到 \(O(n)\)。
上指标求和,太困难。回去严肃背公式。
ARC199C
红温题。有什么难的。
考虑一棵树合法的充要条件,显然是我写出 \([p_u, p_v]\) 区间,这些区间两两只有包含或相离关系。
然后考虑更牛逼的结论,一棵树对于一个排列合法,当且仅当我对于每棵子树,里面的 \(p\) 值构成一段区间。(这里的根是可以任意钦定的。然后“区间”,因为是环形,所以一个前缀和一个后缀也是合法的)
证明的话,怎么去手模一下。
首先就是,如果对于一个合法的树,我令她的标号 \(i\) 改成 \(inv_i\),其中 \(inv\) 是 \(p^1\) 的逆排列,那么就可以达到把 \(p^1\) 改成 \(1,2,\dots,n\) 的效果。那么我如果钦定 \(1\) 为根,那么 \(1\) 子树里面的区间就是整个 \([1, n]\),从而规避了上面“一个前缀 + 一个后缀也是合法”的情况。
这样我某个子树合法,仅当后代标号构成区间。
额那么如果你给某个 \(p\) 的逆排列循环移位一下,显然不会影响答案。然后你就可以给 \(p\) 转到,以 \(1\) 开头。那么就可以彻底规避那个情况。
然后你就区间 DP 就完事了。先三次方随便预处理一下所有合法的区间,然后 DP 就钦定一个根,儿子怎么搞一搞。可能需要一个辅助数组,记录儿子 DP 值的乘积的和。总复杂度 \(O(n^2m+n^3)\)。
重塑时光
省流:\(O(3^n n^2)\) 可过。那这题傻逼成什么样子了!!!!!!
首先就是,计数好像比概率好做一点。那么总方案数是 \(n!\times (n+1)^{\overline k}=(n+k)!\)。然后数合法的方案数。
首先考虑切割成了一些段。那么这些段能够任意重排,但段内不能。所以首先就有段内要求能满足 \(m\) 限制。然后考虑段之间。
考虑把段抽象成一整个点,然后把剩下非自环的限制连成一个图。那么合法要求,图是一个大哥。
那大哥计数是吧(这里不是边定向问题,是缩点问题)。仍然是老套路,钦定零度点集。
但是这题有个小小的问题。我们一个合法的大哥并不唯一对应最终的一个方案数,因为我有一些不同切割的方案。
考虑我如果钦定了最后分成了多少段,那么切割的方案数也就确定了。这个系数可以通过简单 DP 或者简单组合数算出。
也就是我们在大哥计数的时候,状态需要额外设置一维,表示我分成了多少个段(点集大小)。
然后容斥系数仍然是经典的点集大小(这里点集大小不是集合大小了,而是另一维)减一。毛估估一下大概就是,我对于一个钦定的零度点集,她会被怎么计算。我感觉有一点点绕。反正大概还是这样的:
其中 \(g\) 是系数,不难预处理。
总复杂度 \(O(3^nn^2)\),瓶颈在于转移枚举 \(i,j\)。好像能用拉插搞搞,我不会。
说一下卡常,其他能简化计算的就简化,然后注意到图越稀疏,转移越多,但是非 0 的 DP 值会相应减少。那乘法的时候判一下可以大大加快。
upd:现在会了插值了。转移是一个卷积的形式,那么代成点值直接乘,最后插值 \(O(n^2)\) 弄回来。复杂度就变成 \(O(3^nn)\)。
CF1707D
妙妙题哦。
首先拿掉 \(S_i\ne S_{i+1}\) 的限制,方法是二项式反演。这是简单的。
然后考虑怎么刻画虚树的贡献。dx 老师讲的是,给每个结点上面挂一个权值 \(a_u\in [0,n)\),代表 \(u\) 存在于集合 \(S_0\sim S_{a_u}\) 中。
然后虚树的限制就是,每个 \(u\) 都要大于等于 \(T\) 中的次大值。其中 \(T\) 是,\(u\) 的儿子们的子树,子树最大值的集合。特别地,根结点是全局严格最大值。
直接做的话,子树合并的时候要记录次大值,不可接受。
考虑稍加优化。
还是记录 \(f_{u,i}\) 为,子树 \(u\),子树最大值是 \(i\) 的方案数。
对 \(u\) 的情况分类。
- 成为新的最大值:这是好算的,子树累一个前缀和 \(sum\) 乘起来就好。
- 成为新的次大值:\(a_u<i\),且子树恰有一个最大值是 \(i\)。枚举这个,那么大概是
这个记录一下 \(sum\) 的前缀后缀积(避免逆元),然后对 \(\prod sum_j\) 累一个前缀和就好了。
时间复杂度 \(O(n^2)\)。

浙公网安备 33010602011771号