坐牢,牢大
A
考虑函数 \(last_x\) 表示 \(<x\) 的最大的必败态离 \(x\) 的距离,可以得到如下转移:
\[ last_{x+1}=\begin{cases} 1 & ds(x)<last(x)\\ last(x)+1 & ds(x) \ge last(x) \end{cases} \]
其中 \(ds(x)\) 表示 \(x\) 的数位和。实际上状态不能是 \(\le x\) 的最近距离,因为这样子的话转移就和 \(x\) 有关了。
考虑已知 \(last(l * 10^k)\) 如何求出 \(last((l + 1) * 10^k)\) ,当 \(k=0\) 时其转移就是上述转移,当 \(k>0\) 时,我们发现这个过程等价于 \(last(10l * 10^{k-1})\to last((10l + 1) * 10^{k-1})\to\cdots\to last((10l + 10) * 10^{k-1})\) 于是我们就把问题转化到了下一层。
另一个关键观察就是,这个转移的过程只与 \(ds\) 和 \(last\) 有关,证明可以考虑数学归纳法,在 \(k=0\) 时显然,同时第 \(k\) 层依赖于第 \(k-1\) 层的转移。有了这个观察之后一层的状态数就减少到了 \(O(\log^2n)\) 级别。
设 \(f_{k,ds,last}\) 表示当前在第 \(k\) 层,数位和为 \(ds\) ,上一个距离为 \(last\) 时,\(l+1\) 后的 \(last\) 值,转移显然,预处理 \(O(base * \log^3_{base}n)\) ,查询 \(O(base * \log_{base}n)\) ,可以通过本题。
C
考虑不修改咋做。每一个团一定对应一些链在树上的公共点,这些公共点一定有LCA。考虑在LCA处对团计数。假定钦定一个点\(x\)是某个团对应的链对应的公共点的LCA,那么x必须是这些链中某一个链的LCA。否则,它一定不是这些公共点的LCA。因此,考虑\(a_x\)表示有多少条链以\(x\)为LCA,\(b_x\)表示有多少条链经过\(x\)且不以\(x\)为LCA。那么统计\(x\)处的团时,\(a_x\)必须至少选一个,\(b_x\)可以随便选。所以答案是
\[ \sum_{x=1}^n(2^{a_x}-1)2^{b_x}=\sum_{x=1}^n2^{a_x+b_x}-\sum_{i=1}^n2^{b_x} \]
树剖然后搞两棵线段树维护一下。\(O(q\log^2)\)。
G
直接求是 \(O(n^3)\) 的,所以我们需要考虑用点随机化啥的先把可能的位置找出来。考虑随机一个向量 \(\mathbf{x}\) ,可以用 \(\mathbf{BAx}\) 和 \(\mathbf{x}\) 对比找出可能的行,用 \(\mathbf{x^T}\mathbf{AB}\) 和 \(\mathbf{x^T}\) 对比找出可能的列,这里的时间复杂度是矩阵乘向量 \(O(n^2)\) 。
之后考虑对于可能的一行,把可能的列设成变量,可以得到 \(n\) 个等式,算等式是 \(O(n^2)\) 的,然后直接跑高消解方程即可,高消的时间复杂度是 \(O(nk^2)\) 的,其中 \(k\) 是变量个数,显然 \(k\le 12\) 。总共有 \(k\) 行,故总复杂度为 \(O(n^2k+nk^3)\) 。
K
与大小有关,故尝试从小到大插入每个数,假设当前正在插入 \(v\) 处的值,则其左右两边均会有一段比他小的数,记为 \(L,R\) ,记左边第一个比 \(v\) 大的数的位置为 \(l\) ,右边为 \(r\) ,那么我们就得到了一段 \(lLvRr\) 的形状。
考虑如何 \(L\to R\) ,第一步可以走到 \(v\) 或 \(r\) ,可以对每段维护 \(lsum, rsum\) 表示从左/右边开始走需要的总步数,以及 \(lc, rc\) 表示从左/右边开始走更近的数的个数,有了这些值就可以算出 \(L\to R\) 的最小总步数是 \(R.lsum - R.lc + R.len\) ,\(R\to L\) 同理。之后考虑如何合并 \(LvR\) ,这个合并是可以做的,写一写画一画就好。用链表维护即可线性实现。