暑期德国鸡腿堡
07/01/2025
置换
直接做很困难,考虑枚举环长计算方案数。对于环长 \(d\),先选出来 \(d\) 个,环内排列的方案数为 \((d-1)!\)(最开始一个点 \(1\) 中方案,每新加一个点就插入进之前的环里),环外随便排列是 \((n-d)!\),再算上期望,答案是:
然后直接拉插。对于前 \(n\) 个数的幂次,由于是完全积性函数,欧筛即可。
求和
就是求:
在 \(r = 0\) 时还要加上 \(\binom{n}{x}\)。
直接暴力的时间复杂度是 \(O(q \times \frac{n}{k})\) 的,那么显然在 \(k > \sqrt{q}\) 的时候时间复杂度是 \(O(n \sqrt{q})\) 的,直接能过。那么现在的问题就是当 \(k \leq \sqrt{q}\) 时怎么求解。
我们发现这个式子无法化简,难以直接求出,也没有什么特别好的性质。但是我们发现当 \(k \leq \sqrt{q}\) 时,本质不同的询问数量不超过 \(n \sqrt{q}\),所以我们考虑寻找这些本质不同询问之间的关系。
我们设 \(f(x,r) = \sum\limits_{i=0}^{\frac{n}{k} - 1} \binom{ik + r}{x}\)。由组合恒等式,得:
由此我们得到了一个递推式。但是有一个问题就是当 \(r = 0\) 时,由于 \(r\) 为余数,\(r - 1\) 会再次回到 \(k-1\),这就出现了一个环,不能直接递推,所以我们要把 \(r = 0\) 当做边界来处理。但是暴力计算时间复杂度是 \(O(n^2)\) 的,所以我们要考虑其他方法。我们观察到:
所以这时候我们可以考虑从小到大枚举 \(x\)(边界为 \(x = 0\)),然后将每个 \(x\) 的 \(f(x,0)\) 设为未知数 \(a\),然后把 \(a\) 带着递推,最后解个方程就行了。这样最坏的时间复杂度就是 \(O(n \sqrt{q})\) 的。
BST
先考虑树形态固定时怎么把树快速建出来。其实很简单:每新加一个点,它只有可能连接到它当前的前驱或后继上,具体连哪个取决于哪个点后加入。
由此我们得到一条重要性质:\(a_1,a_2,\cdots,a_r\) 把 \(a_{r+1},a_{r+2},\cdots,a_n\) 分成了很多值域连续段,其中每个连续段自成一棵子树,内部形态与外界无关。
这不难证明,如下图:

圆点是 \([1,r]\) 中的点,方点是 \([r+1,n]\) 中的点,红色方点是当前连续段中第一个被加入的。可以注意到只有红色方点会连向圆点,剩下的方点由于先前方点的存在也会连到方点上,所以方点自成一棵子树,且由于 \([r+1,n]\) 加入顺序确定,其形态也固定。
现在再来考虑 \([1,r]\) 中形态有变的问题。\([r+1,n]\) 中的点现在只作为一些子树来加权。而 \([1,l-1]\) 中的点形态也是固定的,所以真正有影响的就只有 \([l,r]\) 中的点。将所有点(三角形是 \([1,l-1]\) 中的点,圆点是 \([l,r]\) 中的点,下面的大三角是 \([r+1,n]\) 形成的子树)放在值域上考虑:

边界上的子树会直接归属于其相邻节点;而如果一棵子树在三角和圆点之间,那么由于圆点加入时间更晚,所以会连向圆点。只有当子树在圆点之间时,子树连向的点才不固定。问题转化为对于每一段在三角之间的圆点和子树,求方案使得深度之和最小,转化一下即每棵子树 \(size\) 之和最小。由于圆点数量 \(\leq 5 \times 10^3\),所以可以考虑 DP。设 \(f_{l,r}\) 表示将 \([l,r]\) 中圆点顺序确定后 \(size\) 和的最小值(其中 \([l,r]\) 管辖的子树包含区间内的和 \([l-1,l]\) 及 \([r,r+1]\) 之间的)。每次转移就去枚举当前子树的根(最先被加入的的点),那么状态转移就是:
其中空区间 \(f\) 值为 \(0\)。这样我们就可以在 \(O((r-l+1)^3)\) 的时间内解决问题。可以观察到此 \(f\) 满足四边形不等式,所以可以使用相关技巧进一步优化至 \(O((r-l+1)^2)\),可以通过。
最小最大
直接做显然不好做。考虑先枚举 \(\min\) 和 \(\max\),然后计算其贡献。这个连通块大小可以转化为枚举点 \(x\),如果 \(x\) 在块内那么权值就加上 \(\min \times \max\)。考虑什么情况下三元组 \((\min,\max,x)\) 合法:这三点两两之间的路径上的最小值都 \(\geq \min\),最大值都 \(\leq \max\)。
由于涉及路径问题。可以考虑使用点分治。对于分治中心 \(y\),设 \(mn(u)\) 表示 \(u\) 到 \(y\) 路径上的编号最小值,\(mx(u)\) 表示 \(u\) 到 \(y\) 路径上的编号最大值,那么三元组 \((\min,\max,x)\) 要满足的条件即为:
- \(mn(\min) = \min,mx(\min) \leq \max\)
- \(mn(\max) \geq \min,mx(\max) = \max\)
- \(\min \leq mn(x),mx(x) \leq \max\)
我们考虑从大到小枚举 \(\min\),那么当 \(\min\) 逐渐减小时,\(\max,x\) 的限制都逐渐放宽,可以考虑使用双指针添加满足 \(mn \geq min\) 的 \(\max\) 和 \(x\)。对于剩下的 \(\max\) 条件,可以使用线段树维护:当加入一个 \(\max\) 时,把它在线段树上标记为可选,权值设为 \(\max\);当加入一个 \(x\) 时,\(\geq mx(x)\) 的 \(\max\) 多了一个可选的 \(x\),那就在线段树上给后缀加一个其自己对应的下标(未被标记的加 \(0\))。对于最后一个限制 \(mx(\min) \leq \max\) 的限制,相当于就是一个后缀求和。线段树上维护的信息形如 \(A \times B\),容易维护。最终时间复杂度就是 \(O(n \log^2 n)\)。
07/03/2025
Count Set
转化一下就是有很多置换环,要求在图上选 \(k\) 个点,满足这些点在环上不相邻。显然不同的环之间没有什么关系,所以可以考虑求出每个环的答案后再合并起来。
对于一个环长为 \(d\) 的环,在其中选 \(i\) 个不相邻的点的方案数容易得到:
那么最终我们可以将每个环的生成函数卷起来,然后直接输出即可。这个东西虽然每个多项式最高次可能不是 \(1\),但是环之间乘出来的最高次就是 \(n\)。我们可以使用分治 NTT 解决,因为分治树高为 \(O(\log n)\),所以每个多项式最多被算 \(O(\log n)\) 次,总复杂度就是 \(O(n \log^2 n)\)。也可以使用堆进行合并果子,时间复杂度也是 \(O(n \log^2 n)\)。
Shattrath City
正难则反,考虑计算不合法的方案数。设 \(f_i\) 表示前 \(i\) 个数已经选好,且第一个不合法的排列在 \(i\) 处结束。那么转移是很显然的:
可以发现这是个半在线卷积,可以用分治 NTT 做到 \(O(n \log^2 n)\)。但是我们还可以进一步优化。
设:
那么:
现在可以采用多项式求逆,时间复杂度可以做到 \(O(n \log n)\)。
Gilneas
期望直接算不好算,可以考虑计算每一次操作对于答案的贡献。
对于一条边 \((u,v)|depth_u < depth_v\) 如果它最后一次是被操作 \((x_i,c_i,p_i)\) 染色为 \(c_i\):
- \(x_i\) 要在 \(v\) 的子树中
- \(i\) 之前的操作不影响此次染色,所以 \([1,i-1]\) 这些操作对应概率是 \(1\)。
- 对于 \(i\) 之后的操作,如果有某次操作访问到了 \(u\) 或者 \(v\),那么第 \(i\) 次染色操作无效。对于这种操作,为了让其不影响 \(i\) 号操作,需要乘上 \(1 - p_j\) 的概率。
所以可以考虑按照时间倒序枚举,每次算答案时将 \(x_i\) 到根路径上的边的概率之和求出,然后再乘上 \(c_i p_i\),修改操作就修改和 \(x_i\) 到根有连接的边。这个东西看似可以直接树剖,但是修改时如果直接改的话对于每个点都要修改其领域内的边,难以维护。
我们可以发现,如果修改时我们访问到了点 \(u\),那么所有边 \((u,v)|depth_u < depth_v\) 概率都会乘上一个值;而如果是访问到了 \(v\),那么 \(u\) 肯定也会被访问到。所以点 \(v\) 其实是没有什么用处的,我们只用看父节点对应的概率即可。这样修改时正常从 \(x_i\) 开始往上改,查询时由于概率上放到了父亲,所以要从 \(fa_{x_i}\) 开始询问。这样就可以使用树剖,时间复杂度 \(O(n \log^2 n)\)。
Connectivity of Erdős-Rényi Graph
可以通过计算连通块数量为 \(i\) 的概率,再乘上 \(i\),最后求和来计算期望。
对于这种数据范围较大的一类有标号无向连通图计数 / 算概率的问题,可以考虑使用指数型生成函数求解。
有标号连通无向图满足如下式子:
套用到本题上,假设我们现在已知 \(f_i\) 表示点数为 \(i\) 的无向图连通的概率,可以考虑用类似的方法求解 \(g_n\) 表示点数为 \(n\) 时的答案。考虑枚举连通块数量:
组合数后面的系数意义为这 \(i\) 个连通块两两之间没有边相连。直接算出连通块之间的边数比较复杂,可以考虑用总共有的边数,减去每个连通块内的所有边数(块内已确定),即为:
然后化简之前的式子:
用同样的方法可以推得 \(\hat{F}(x)\)。考虑一张图所有情况的概率加起来是 \(1\),所以:
所以:
这样就可以使用多项式技巧在 \(O(n \log n)\) 的时间内求解。

浙公网安备 33010602011771号