A. An Easy Geometry Problem
差分之后条件相当于类似 \(a_{i - 1} + a_i = k + b\) 且 \(a_{i - r + 1} + a_{i + r} = k\) 的条件,线段树维护 \(a_i\) 和 \(k - a_{n - i}\) 的哈希值,查询直接二分即可。
时间复杂度 \(O(n + q \log^2 n)\)。
B. Counting Multisets
考虑 \(p(S)\) 为奇数相当于什么。设 \(i\) 的出现次数为 \(c_i\),那么条件相当于 \(c_i\) 在二进制下不交。其他条件相当于 \(\sum c_i = n\) 且 \(\sum c_i \cdot i = x\)。
拆位,相当于要选一些 \(d_{i, j} \in \{0, 1\}\) 使得 \(\sum\limits_{i \in n} \sum\limits_{j \in y} 2^{i + j} d_{i, j} = x\)。
可以看成是一个 \(\log n \times \log y\) 的 \(01\) 矩阵,使得 \(n\) 为 \(0\) 的那行全是 \(0\),且因为要求全部 \(y \subseteq y_{\max}\) 的答案还要记录当前有哪些列已经有 \(1\) 了。
一行一行或者一列一列地 dp 都不行。考虑按对角线顺序 dp,即按所有格子的 \(i + j\) 大小 dp。然后状态再记一个进位数(这个是 \(O(\log y)\) 级别的),还有当前哪些列已经有 \(1\)。
时间复杂度 \(O(2^{\text{pcnt}(y_{\max})} \log n \log^2 y)\)。
C. Counting Strings
看到数本质不同子串直接上 SAM。对于 SAM 上的一个点 \(u\),设其 endpos 集合为 \(E\),代表子串长度范围为 \([L_u, R_u]\),则其贡献为:
\[\sum\limits_{i = L_u - 1}^{R_u - 1} [\exists x \in E, \gcd(x, i) = 1] (i + 1) \]考虑枚举每个 \(i\) 算贡献。相当于对于所有 \(\gcd(x, i) = 1\) 的 \(x\),设 \([1, x]\) 在 SAM 上对应点 \(u\),那么可以覆盖 \(u\) 到根的链上所有点,最后所有被覆盖的点的个数乘 \(i + 1\) 就是贡献。
\(\gcd(x, i)\) 的 \(x\) 的个数很多,不能暴力枚举。可以考虑去搜 \(i\) 的质因数集合,一开始把所有点加入一个集合,每搜过一个质数就把它的倍数全部从集合删去。删一个数 \(u\) 要做的操作是,找到它最浅的祖先 \(v\) 使得当前 \(v\) 子树内只有一个未被删的点 \(u\) 了,然后把 \(v\) 到 \(u\) 链上所有点的 \([L_u - 1, R_u - 1]\) 都减 \(1\)(因为树上祖先到儿子的长度范围连续,所以这部分直接找到对应的 \([l, r]\) 然后直接减即可)。因为要平衡复杂度所以区间加单点查可以转化成单点加前缀查然后做 \(O(1) - O(\sqrt n)\)。
现在剩下一个问题:如何找到最浅的祖先 \(v\)。考虑找到 \(u\) 在 dfs 序上的前驱后继,取 \(u\) 和它们 LCA 的较深点即可。这部分可以使用链表维护。
于是总时间复杂度 \(O(X + n \sqrt n)\),\(X\) 为每个点被删除次数的总和。实际上 \(O(\text{可过})\)。
D. Bracket Sequence
先考虑第一种询问。把询问挂到猫树上,对前缀和后缀 dp,状态记录选了多少个括号,还有上一个选的括号类型。
考虑第二种询问。对每个子序列拆贡献,设子序列范围为 \([L, R]\),询问区间为 \([l, r]\),这个子序列的贡献就是 \((L - l + 1)(R - r + 1)\)。拆贡献,相当于要计算 \(LR\) 的和,\(L\) 的和,\(R\) 的和。dp 的时候可以再记一维状态表示是否已经选了子序列的左/右端点。
时间复杂度 \(O(nk \log n + qk)\)。
E. Dominating Point
首先出度最大的点 \(u\) 一定是支配点,因为不存在它的一个前驱能到达这个点以及它的所有后继。
如果 \(u\) 能到达所有点那么其他点一定不是支配点。否则找到它的前驱形成的子图的支配点,则这个支配点 \(v\) 也是整个图的支配点。
如果 \(v\) 在子图中不能到达所有点那么对其在子图中的前驱如法炮制即可找到第三个支配点(相当于递归解决)。
否则找到 \(u\) 的后继去掉 \(v\) 的后继的子图的支配点,那么它也是整个图的支配点。
时间复杂度 \(O(n^2)\)。
F. An Easy Counting Problem
相当于要选 \(k\) 个 \(\binom{a}{b}\) 使得其乘积在模 \(p\) 意义下为 \(x\)。
设 \(\binom{a}{b} \equiv t \pmod p\) 的个数为 \(g_t\)。考虑 dp,转移形如 \(f'_x g_y \to f_{xy \bmod p}\)。套路地取 \(p\) 的原根,化乘为加,有 \(f'x g_y \to f_{(x + y) \bmod p}\)。发现这是一个类似循环卷积的东西,相当于要求一个多项式的 \(k\) 次循环卷积。直接快速幂即可。
时间复杂度 \(O(p \log p \log k)\)。
G. An Easy Math Problem
首先不考虑 \(p \le q\) 的限制。考虑 \(n\) 的一个质因子的次数为 \(c\),那么 \(r\) 的这个质因子的次数能取到 \([-c, c]\)。考虑 \(p \le q\) 相当于把 \(r < 1\) 都删掉,所以答案就是 \(\frac{1 + \prod (2c + 1)}{2}\)。
时间复杂度 \(O(\sqrt n)\)。
H. Elimination Series Once More
建出二叉树,相当于求每个点 \(u\) 最浅的祖先使得子树内比 \(u\) 大的值的个数不超过 \(k\),且子树大小 \(\le u\)。容易归并求出 \(f_{u, i}\) 表示 \(u\) 的 \(i\) 级祖先的子树内有多少个比 \(u\) 大的数。
时间复杂度 \(O(n 2^n)\)。
I. Max GCD
考虑枚举 \(\gcd\) 找支配对 \((i, k)\),然后二维数点即可。
找支配对可以枚举 \(i\),钦定 \(j\) 为 \(i\) 下一个是当前枚举的 \(\gcd\) 的倍数的位置,然后二分 \(k\)。
时间复杂度 \(O(nd \log n + q \sqrt n)\)。
J. Graph Changing
经过一次操作后图上任意两个非孤立点的点距离 \(\le 3\),所以 \(k \ge 4\) 且 \(t \ge 2\) 就直接无解。
特判 \(t = 1\)。
发现 \(k = 3\) 且 \(n \le 7\) 的情况有一点特殊,要暴力特判。
\(t \ge 2\) 且 \(n \ge 8\) 且 \(k = 3\) 就是无解。
剩下 \(k = 2\) 且 \(n \ge 2\) 的情况(注意特判 \(n = 3, 4\)),显然操作奇数次后图会变成 \(G_0\) 的补图,操作偶数次后图会变成 \(G_0\)。
时间复杂度 \(O(q)\)。
K. Penguins in Refrigerator
先考虑第二问,设 \(p_i\) 为第 \(i\) 只企鹅进入的时间。建一个 DAG,若 \(p_i > p_j\) 且 \(a_i + a_j > m\) 就连 \(i \to j\),然后相当于求这个 DAG 的最小拓扑序。cdq 分治优化建图即可。
再考虑第一问。设 \(p = \operatorname{argmax} a_i\),那么 \(a_i + a_p \le m\) 的点 \(i\) 可以随意交换,删除它们之后相当于变成了 \(p\) 左边和 \(p\) 右边的两个子问题。
考虑这个东西的本质,相当于是建出大根笛卡尔树后,给每个点 \(u\) 找一个最浅的祖先 \(p\) 使得 \(a_u + a_p \le m\)。可以把 \(u\) 挂到 \(p\) 上,dfs 算一个类似子树大小的东西,考虑到每个点就乘一个挂在它上面的点随意选位置的系数即可。
时间复杂度 \(O(n \log n)\)。
L. Prism Palace
考虑凸包每条边成为 \(S\) 的最大值且等于剩下数总和的概率。相当于这条边的投影要把整个凸包以及其他阴影全部覆盖。
设一条边相邻两个内角分别为 \(\alpha, \beta\)。首先必须满足 \(\alpha + \beta \le \pi\),不然它覆盖不了整个凸包。然后平移后的多边形要在它的两条邻边所在直线相交形成的区域内,概率为 \(\frac{\pi - \alpha - \beta}{\pi}\)。枚举每条边并对这个东西求和即可。
时间复杂度 \(O(n)\)。
M. Random Variables
容斥,算全部数出现次数 \(\le k\) 的方案数。
可以把现在的问题抽象成,\(n\) 个互相区分的小球放入 \(m\) 个互相区分的盒子,且每个盒子大小 \(\le k\) 的方案数。
设 \(f_{i, j}\) 为 \(n = i, m = j\) 时上述问题的答案。考虑第 \(i\) 个球,对其所在盒子容斥,要么随便找一个盒子放,要么放到了一个大小为 \(k + 1\) 的盒子内(即它新开了一个超出限制的盒子)。有转移 \(f_{i, j} = f_{i - 1, j} \times j - f_{i - k - 1, j - 1} \times \binom{i - 1}{k} \times j\)。初值为 \(\forall i \in [0, m], f_{0, i} = 1\)。
发现只有满足 \(j \ge m - \frac{n}{k + 1}\) 的 \(j\) 才会对最终的 \(f_{n, m}\) 有贡献。所以 dp 第二维只有 \(O(\frac{n}{k})\) 个取值。枚举每个 \(k\) 并做 \(O(\frac{n^2}{k})\) 的 dp,复杂度就是 \(O(n^2 \ln n)\)。
N. Python Program
没有人喜欢这种题。
标签:le,log,Universal,Xi,考虑,相当于,复杂度,dp,Stage From: https://www.cnblogs.com/zltzlt-blog/p/18409160