ARC++ 230
难度排序 \(D\to A\to B\to C\)(?
A
考虑枚举每一条边被经过几次,易得:
其中 \(x\) 是子树大小。因为 \(\min(i,j)=\frac12(i+j-|i-j|)\)。
我们有
同理有 \(B=(n-x)2^{n-1}\)。
不妨做换元 \(u=n-x,k=u+j\),然后应用范德蒙德恒等式:
对于后半段,进一步展开绝对值并区间再现,并记:
有:
预处理 \(P,Q\) 取值即可 \(O(1)\) 求和。
B
正向维护比较困难,不妨逆向维护,考虑在一定操作下,什么样的 \(A\) 可以最终变成 \(B\)。
可以归纳证明,合法的 \(a\) 永远位于一个区间 \([l,r]\) 中。
具体地,初始时只有 \(a=b\) 合法,即 \([b,b]\)。
可以验证,对于一个区间 \([l,r]\),若对 \(x\) 应用 chmax 操作:
- 若 \(x>r\),则不存在合法值,区间为空。
- 若 \(x<l\),则区间保持不变。
- 若 \(x\in[l,r]\),区间变为 \((-\infty,r]\)。
同理可以写出关于 chmin 的对应操作。
由此可以发现,当区间初始值为 \([b,b]\) 时,整个过程中只有 \(4\) 种可能的取值:
- \([b,b],(-\infty,b],[b,\infty),(-\infty,\infty)\).
不妨记 \(u_i,v_i\) 分别表示上/下界有没有被扩展。
一个有效的操作总是至少将一个 \(u/v\) 从 \(0\) 变为 \(1\),且此后不会再变回 \(0\)。
由此可证至多只存在 \(2N\) 次有效操作。
不难做到 \(\mathcal O(n^2)\) 找到一个有效操作。
找到所有的有效操作后按 \(u_i,v_i\) 判定 \(a\) 是否合法即可。
由操作上界保证复杂度 \(\mathcal O(n^3)\)。
C
假如我们已知序列 \(H\),不妨取其笛卡尔树。
可以证明的是,下标相邻的数在笛卡尔树上必为 祖先-后代 关系。否则取其 LCA,下标在两者之间,与相邻矛盾。
设点 \(u\) 在笛卡尔树上的深度是 \(d_u\),则易得 \(C_i=\max(d_i,d_i+1)\)。
考虑每次删去一个深度最深的叶子,即设序列最大值 \(m\),找到 \(m,m\) 第一次出现的位置,并将其替换为 \(m-1\),过程中维护其子树大小,即可重构出笛卡尔树。
计数 \(H\) 相当于求笛卡尔树拓扑序数,设 \(u\) 子树大小为 \(s_u\) 有经典结论答案为:
另外一点是,上述算法实际上要求 \(C_0\) 和 \(C_n\) 的值已知。但实际上未知。
只需注意到,逆序观察上述过程,相当于从 \([0]\) 开始,每次将 \(c\) 替换为 \(c+1,c+1\),由此可得
总成立,那么 \((C_0,C_n)\) 只有最多两种情况,分别计算即可。
D
考虑记题中等式两边 \(=k\)。
记 \(X,k,Y\) 分别表示矩阵中 \(<k\),\(=k\),\(>k\) 的数。
题意即至少有一列不含有任何 \(X\),至少有一行不含有任何 \(Y\)。
记 \(X\) 贡献 \(x\),\(Y\) 贡献 \(y\),\(E\) 贡献 \(1\)。
直接容斥得生成函数:
不妨枚举 \(k\) 并代入 \(x=k-1,y=M-k\)。
欲快速求这个式子的值,不妨反向应用二项式定理:
由此即可在 \(\mathcal O(A\log*)\) 的复杂度内求出单项 \(f(k)\)。
再次注意到 \(f(k)\) 作为关于 \(k\) 的多项式项数不超过 \(AB\),则取其前缀和 \(F(k)\) 项数同样是 \(\mathcal O(AB)\) 的。那么暴力求出足够多项后拉插即可快速求 \(F(M)\)。
时间复杂度 \(\mathcal O(A^2B\log*)\)。
本文来自博客园,作者:CuteNess,转载请注明原文链接:https://www.cnblogs.com/CuteNess/p/23099612

浙公网安备 33010602011771号