近期省选题思路整理 II
是 2017 年的省选题捏。
-
给无向图加边变成仙人掌,先考虑一棵树的情况。
可以使用树型 dp 求解,首先预处理 \(g_i\) 表示考虑与某个点相连的 \(i\) 条有标号边,它们之间两两匹配或者落单的方案数。
那么 \(f_u = g_{\deg(u)} \prod_{v \in son(u)} f_v\)。
对于一般图,先判断仙人掌,然后去掉环后各个部分分别 dp 即可。
-
首先发现她写得那个玩意是单点加,查询后缀和。所以查询的正确性也就是 \(a_{l - 1} = a_r\) 的概率。
用二维线段树对二元组 \((l, r)\) 维护 \(a_l = a_r\) 的概率,大力分类讨论即可。
-
毒瘤。
-
找到以 \(0\) 为根节点的最长链长 \(l\)。如果步数 \(\le l\),那么答案就是 \(l + 1\)。否则,剩下的步数每多 \(2\) 步可以多一个结点(在 dfs 到支链顶点的时候下去若干个结点然后回到主链上)。
-
寄算几何。
-
\(\dfrac{f(a, a+b)}{a(a+b)} = \dfrac{f(a, b)}{ab}\),也就是说这个东西是可以两个维度做差的。
做到最后就是辗转相除法,也就是说 \(\dfrac{f(a, b)}{ab} = \dfrac{f(g,g)}{g^2}\),其中 \(g = \gcd(a, b)\)。
所以 \(\gcd\) 不同的格子是互不影响的,考虑求答案:
\[\begin{aligned} & \sum_{i=1}^{k} \sum_{j=1}^{k} \dfrac{ij}{g^2} f(g, g) \\ = & \sum_{g = 1}^{k} \sum_{i' = 1}^{k / g} \sum_{j' = 1}^{k/g} i'j' f(g, g) [i' \perp j'] \\ = & \sum_{g = 1}^{k} \sum_{i'=1}^{k/g} \sum_{j'=1}^{k/g} \sum_{d | \gcd(i', j')} i' j' f(g,g) \mu(d) \\ = & \sum_{g=1}^{k} f(g, g) \sum_{d=1}^{k/g} \mu(d) \sum_{i''=1}^{k/gd} \sum_{j''=1}^{k/gd} i'' d j''d \\ = & \sum_{g=1}^{k} f(g, g) \sum_{d=1}^{k/g} \mu(d) d^2 S^2(k / gd) \\ = & \sum_{g=1}^{k} f(g, g) G(k/g) \end{aligned} \]求答案难免要对 \(g\) 整除分块,询问次数在 \(O(m \sqrt{n})\) 级别,修改次数在 \(O(m)\) 级别。所以使用 \(O(\sqrt{n})-O(1)\) 的分块维护 \(f\) 的区间和。\(G\) 的差分是积性函数可以提前线性筛预处理。总时间复杂度 \(O(m \sqrt{n})\)。
-
线性筛预处理,等价元素分个类,然后矩阵快速幂。 \(O(p^3 \log n)\)。
更好的做法是直接多项式暴力循环卷积快速幂。\(O(p^2 \log n)\)。
-
发现每种颜色在树上必然呈现一条“祖先—后代”的链。
所以在自己颜色不同于父亲颜色的地方打一个 \(+1\) 标记即可,简单树链剖分维护。
-
莫反+整除分块,做过了。
-
0/1 分数规划+二分图匹配,做过了。
-
设 \(G(x)\) 表示第 \(k\) 轮后还不结束,\(F_i(x)\) 表示第 \(k\) 轮后 \(i\) 获胜 的 PGF。
\[g_k = g_{k + 1} + \sum_{i=1}^{n} f_{i\ k+1} \Leftrightarrow G(x) x + 1 = G(x) + \sum_{i=1}^{n} F_i(x) \]然后考虑在某个未结束状态后面加上一个给定的串 \(s_i\),必然到达一个已经结束的状态,但这个过程中有可能提前结束。
\[ g_k \times \frac{1}{2^m} = \sum_{j=1}^{n} \sum_{len=1}^{m} [\textit{pre}_{i, len} = \textit{suf}_{j, len}] f_{j\ k+len} \times \frac{1}{2^{m-len}} \\ \frac{1}{2^m} G(x) x^m = \sum_{j=1}^{n} \sum_{len=1}^{m} [\textit{pre}_{i, len} = \textit{suf}_{j, len}] \frac{1}{2^{m-len}} x^{m-len} F_j(x) \]带入 \(x = 1\),高斯消元 \(O(n^3)\)。
-
线段树乱推。
-
粪。
-
路径长度限制一眼点分治,合并分治中心的两条路径显然是 \(val_x + val_y\),如果颜色相同还要 \(-w_{col}\)。
来自同一子树的路径的第一条边的颜色显然都是相同的,所以把所有路径按照第一条边的颜色排序之后,分别用两棵线段树维护颜色相同和颜色不同的最大值即可。
时间复杂度 \(O(n \log^2 n)\)。
-
建出 AC 自动机,\(f_{i, j}\) 表示当前串长为 \(i\),在 AC 自动机上的 \(j\) 点的方案数。直接枚举接下来放的基本单词转移即可。
对于 \(L\) 很大而基本单词长度 \(\le 2\) 的情况,可以矩阵快速幂。
-
由于单旋的是最值,意味着我们一直在左旋,或者一直在右旋。
手动模拟一下发现,单旋操作就是原来唯一的子树接到自己父亲上面去,然后把原来的根接到自己身上,自己变成根。所以原来子树内结点深度不变,其他点深度 \(+1\)。如果需要删除的话就再全局 \(-1\)。
搞一个
set
来查询前驱后继,显然一个点要么被挂在前驱上要么被挂在后继上。 -
先不考虑多组询问,预处理找到 \(i\) 左右两边第一个 \(>k_i\) 的位置 \(L_i, R_i\)。
考虑以 \(k_i\) 为区间内最大值产生的贡献:对 \(l = L_i, r = R_i\) 的区间有 \(p_1\) 的贡献;对 \(l = L_i, r \in (i, R_i)\) 以及 \(l \in (L_i, i), r = R_i\) 的区间有 \(p_2\) 的贡献。
考虑多组询问的时候,如果 \([L_i, R_i]\) 没有被完整包含,那么贡献就是 \(0\),否则贡献是一个固定的数。离线排序后简单树状数组维护即可。
-
FFT,做过了。
-
首先注意到,和自己的自信值有关的只有一个操作,且在任意一天怼大佬的效果是一样的。
所以先 dp 求出最多可以空出多少天来怼大佬,问题就转化为了用这么多天能不能把大佬给怼死。
暴力把所有嘲讽值和花费的天数搞出来,不怼和怼一次比较好判断,假如怼了两次,天数分别为 \(d_1, d_2\),嘲讽值分别为 \(c_1, c_2\),那么就要求
\[c_1 + c_2 \le C, c_1 + c_2 + D - d_1 - d_2 \ge C \]按照 \(c\) 把各种方案排序,第一个限制直接双指针处理,第二个限制维护后缀的 \(c_2 - d_2\) 的 \(\max\) 即可。
-
计算几何,好像是转化一下射线形态之后胡乱贪心。
-
有一些方案,当你把 \(a+b\) 个硬币的状态全部取反后,胜负会发生改变。
首先特判 \(a = b\),答案是 \(\dfrac{2^{2a} - \binom{2a}{a}}{2}\)
而 \(a > b\) 时,一个方案取反,要么胜负发生改变,要么始终是 A 赢。设第一类方案有 \(p\) 个,第二类有 \(q\) 个,那么 \(p+q = 2^{a+b}\),要求的答案为 \(\dfrac{p}{2} + q = \dfrac{2^{a+b} + q}{2}\)。
第二类方案需要满足的条件是,设 A 有 \(x\) 个正面,B 有 \(y\) 个正面,那么 \(x > y\),\(a - x > b - y\)。
\[ \begin{aligned} & \sum_{y=0}^{b} \sum_{x=y+1}^{a-b+y-1} \binom{a}{x} \binom{b}{y} \\ = & \sum_{y=0}^{b} \sum_{d=1}^{a-b-1} \binom{a}{y+d} \binom{b}{b-y} \\ = &\sum_{d=1}^{a-b-1} \binom{a+b}{b+d} \end{aligned}\]计算 \(O(a-b)\) 次组合数即可,需要使用扩展卢卡斯定理。因为模数形如 \(10^k\),所以求出 \(\bmod 2^k\) 和 \(\bmod 5^k\) 的余数即可。
-
给的是补图,而且是一个二分图。
原图的最大团 = 补图的最大独立集。
二分图的最大独立集 = $|V| - $ 最大匹配,进而变成了求哪些边是必须边。
于是跑一遍 dinic,残量网络 tarjan 缩点,有经典结论:
- 必须边:满流且两端不在同一个 SCC 中。
- 可行边:满流或两端在同一个 SCC 中。
-
由于字符串随机,大概 LCP 都是不超过 \(O(\log n)\) 的。
现对每个 \(r\) 预处理一个长度 \(O(\log n)\) 的数组,表示它与之前最近的哪个后缀 LCP \(\ge x\)。预处理可以使用 trie 树,一个串经过某个结点就在上面打一个标记,只要看当前串走的时候经过了对应层的哪个标记就行了。
这样每次回答询问的时候只要在对应的数组上扫一遍即可。
-
加边删边考虑使用线段树分治。
求图 \(1 \to 1\) 的环路的异或和可以转化为选择图中若干个简单环的异或值再异或起来。也就是说,把简单环的异或值丢进一个线性基里,求线性基的 \(\max\) 即可。
这里要写可撤销线性基。因为初始图连通且不会被删除,所以可以先搞出来一棵 dfs 树,显然一条新加入的边对应了一个简单环。
存进线性基的值要拿
bitset
压一下位。 -
容易发现,无障碍时,答案只和
popcount
有关。先预处理一个数组 \(f(i, j, k)\) 表示在三个维度分别增加 \(i, j, k\) 个 \(1\) 有多少种走法,转移:\[f(i, j, k) = \sum_{x=0}^{i} \binom{x}{i} f(i-x, j, k) + \cdots + \cdots \]然后把所有障碍按照 \(x, y, z\) 三元组,排序。设 \(g_i\) 表示从原点走到障碍 \(i\) 的方案数,那么根据容斥:
\[g_{i} = f(|x_i|,|y_i|,|z_i|) - \sum_{P_j \sube P_i} g_j f(|x_i|-|x_j|,\cdots,\cdots) \]方便起见可以把终点当作第 \(n+1\) 个障碍物。时间复杂度 \(O(n^2)\)。
-
两个串 \(S, T\) 相等的条件是 \(|S| = |T|, lcp + lcs + k \ge |S|\)。
对正串、反串分别建 ACAM。拿文本串在正串的 ACAM 里匹配,如果文本串某个前缀 \(p\) 对应点 \(u\) 在某个模式串的一个前缀 \(q\) 对应点 \(v\) 的 fail 子树里,那么假设文本串的下标 \(p+k+1\) 对应的点 \(u'\) 在模式串的下标 \(q+k+1\) 对应的点 \(v'\) 的 fail 子树里,就会产生一个贡献。
用树状数组维护反串 fail 树的 dfs 序,在正串 fail 树 dfs 的时候在反串上对应的位置进行单点加、区间查询即可。
注意到,当 \(lcp + lcs + k > |S|\) 时,这个做法可能会算重。不妨钦定只在极长的后缀匹配点统计,那么在统计 \(u', v'\) 的贡献的时候,应当减去 \(p+k\) 和 \(q+k\) 对应的点的贡献(除非 \(v\) 对应的 \(lcp = 0\)),相当于是把这个方案放在 \(lcp\) 少匹配一位,\(lcs\) 多匹配一位的时候统计。
-
考虑枚举出分的时间,那么 \(C\) 带来的代价随之固定,考虑怎么计算出为了满足这个条件 \(A, B\) 带来的代价。
如果 \(B \le A\) 的话,显然只会用 \(B\) 而不会用 \(A\),可以简单计算;如果 \(B > A\) 的话,就计算一下有多少是可以抵消,有多少是不能抵消的,对于可以抵消的部分就用 \(B\),不能抵消的部分就用 \(A\)。
前缀和优化 或者 三分 都可以。
-
不难发现答案为 \((1+x)^{nk} \bmod x^k\) 后得到的 \(x^r\) 的系数。
所以循环卷积快速幂即可,卷积暴力做,时间复杂度 \(O(k^2 \log nk)\)。
-
有扩展欧拉定理 \(a^p \equiv a^{p \bmod \varphi(m) + \varphi(m)} \pmod{m}\),\((p \ge \varphi(m))\)。
显然一个位置至多被修改 \(O(\log n)\) 次之后,就不会再改变了,考虑直接预处理出 \(A_{i, k}\) 表示 \(a_i\) 被替换了 \(k\) 次 \(c_{a_i}\) 后会变成什么数字。
预处理乍一看是 \(O(n \log^2 n)\) 的,但只要对 \(O(\log n)\) 个模数分别预处理一下光速幂就可以做到 \(O(n \log n)\)。
接下来线段树操作,区间记录一下是否还有可能再改变值的点,如果有就暴力下去递归操作,如果没有就直接返回。根据势能,时间复杂度是 \(O(n \log n)\) 的
-
写个 \(x = 0\) 的部分就行了。
分类讨论,震撼,震撼。
-
最大权闭合子图。
把 \(d_{i, j}\) 看作一个物品,每种类型 \(a_i\) 再看作一个物品,那么:
选了 \(d_{i, j} (i < j)\) 就必须选 \(d_{i+1, j}\) 和 \(d_{i, j-1}\)。
选了 \(d_{i, i}\) 就必须选 \(a_i\)。
这样就可以刻画代价:选择 \(d_{i, j}\) 的代价为 \(d_{i, j}\),选择 \(d_{i, i}\) 的代价为 \(i\),选择 \(a_i\) 的代价为 \(m a_i^2\)。
最大权闭合子图的求法是,把原图每条边看作 \(+\infty\),然后 $S \to $ 正权点连花费为 权值 的边,负权点 \(\to T\) 连花费为 \(|\) 权值 \(|\) 的边,求所有正权之和 \(-\) 最小割即可。
-
先考虑怎么求最优方案:显然从 \(n\to 1\) 扫一遍,遇到亮的就按就行了。
这启示我们,虽然按键之间有关联,但实际上还是 \(n\) 个互相独立的原件,在将输入的状态经过一定的转化之后,可以转化为互不相干的问题。
那么在转化之后,考虑设 \(f_i\) 表示当前有 \(i\) 个 \(1\),期望操作多少次达成目标。显然
\[f_i = i\ (i \le k) \\ f_i = \frac{i}{n} f_{i-1} + (1 - \frac{i}{n}) f_{i+1} + 1\ (i > k) \]高斯消元是不可能的,考虑转化一下下面的方程:
\[ \frac{i}{n} (f_{i} - f_{i-1}) =(1 - \frac{i}{n}) (f_{i+1} - f_i) + 1 \]令 \(b_i = f_{i} - f_{i-1}\) 可以简单递推出来 \(b\),然后累加即可。
-
离散化 + 差分 + 离线扫描线 + 树状数组。
-
把点集合 \(4\) 染色,可以使得每种违规图形都是恰好经过每个颜色一次。
然后直接拆点,建图跑最小割即可。
复杂度有点飘,但能过。
-
HEOI2013 SAO 的弱化版本,所以直接考虑一般树的 \(O(n^2)\) 解法。
设 \(f(u, k)\) 表示考虑 \(u\) 的子树,其中 \(u\) 上面放的数字在子树内当前排名(比它小的数的个数)为 \(k\) 的方案数。
然后对于 \(u\) 的一个儿子 \(v\),如果 \(v < u\),那么枚举一个 \(i\) 表示 \(v\) 的子树中有 \(i\) 个在 \(u\) 前面,\(j \ (0 \le j < i)\) 表示 \(v\) 自己的排名,那么 \(f(v, j)\) 和 \(f(u, k)\) 合并也就是 \(f(u, k+i) \gets f(u, k) \times f(v, j) \times \binom{k+i}{i} \times \binom{size(u) - k - 1 + size(v) - i - 1}{size(v) - i - 1}\)。
容易发现,枚举 \(i\) 之后,\(j\) 可以用一个前缀和优化掉。
\(v > u\) 的分析同理,时间复杂度同树型背包是 \(O(n^2)\) 的。
-
矩阵快速幂,做过了。
-
二元组
swap
,全局逆序对。简单拆一下贡献,然后树套树维护即可(树状数组套动态开点权值线段树)。
-
求前缀和之后,统计每一种 \(s_i - s_j\) 的值出现了多少遍,是一个减法卷积,可以直接 FFT。
另一种方法,01-trie 维护全局 \(+1\),单点插入,全局和 是好做的,这题 \(\sum a \le 10^6\),所以把全局 \(+a_i\) 拆成若干个全局 \(+1\) 即可。
-
\(O(n^2)\) 的做法是,显然被断掉一条边之后,新建的边一定在是两边树的直径的中点,暴力寻找位置即可。
\(O(n)\) 的做法是,显然断掉的边必须是原来的直径上的,考虑从左到右枚举删去了哪条边,动态维护直径中点的位置,显然直径中点的总的移动次数是 \(O(n)\) 的。
-
题目要求形如 \(\dfrac{\prod b_i}{\prod a_i}\) 在 \(\bmod M\) 的意义下的逆元。
把 \(M\) 用 Pollard-Rho 给分解了,把 \(\prod a, \prod b\) 中这些质因子全部分解出来,分解完了之后,剩下的部分显然与 \(M\) 互质可以直接欧拉定理求逆,而质因子的指数必须全部 \(\ge 0\) 才行,否则无逆。
时间复杂度 \(O(k(m \times \omega(M) + \sqrt[4]{M}))\)。
-
搞出后缀数组,暴力枚举匹配点的开头,每次跳一个 \(lcp\),然后跳过不相同的字符,继续跳 \(lcp\),最多跳 \(4\) 次,如果跳出的距离 \(\ge |S_0|\) 就算成功。
用 ST 表维护 height 可以做到 \(O(n \log n + n)\)。
这么一看直接 hash 也行 /oh。
-
狗都不写/qd。
-
首先发现必然有一条链从 \(1\) 取到叶子,花费也就是 \(h\)。
不妨考虑枚举这条链之后,剩下的部分至多选 \(k\) 个的最大收益。
- 对于链上的点,可以任意选取 \(a_i - 1\) 个,无限制。
- 对于链外的点,可以被断成若干棵子树,可以选取 \(a_i\) 个,但选了自己就必须选父亲。
搞出 dfs 和 ext 序,定义 \(f(u, i)\) 表示考虑了 dfs 序上的 \([1, u]\),体积为 \(i\) 的最大收益,\(g(u, i)\) 表示考虑 ext 序上的 \([u, n]\),体积为 \(i\) 的最大收益。为了避免重复计数,钦定 \(f\) 中考虑第一类贡献而 \(g\) 中不考虑。
\(f\) 的求法:当前在 \(u\),给 \(f_u\) 加入 \(a_u - 1\) 个 \(v_u\) 做多重背包,然后枚举儿子 \(v\),把 \(f_u \to f_v\),递归;从 \(v\) 返回的时候,\(f(u, i) \gets \max\{f(u, i), f(v,i-1)+v_v\}\)。
\(g\) 的求法:当前在 \(u\),枚举儿子 \(v\),先把 \(g_u \to g_v\),递归;从 \(v\) 返回的时候,\(f(u, i) \gets \max\{f(u, i), f(v,i-x)+v_v x\}\ (1 \le x \le a_v)\)。
然后枚举叶子结点,把 \(f, g\) 合并就可以得到答案。
-
FWT + 动态 dp 先省省吧。
-
将每条边 \(e\) 拆点成 \(in_e\) 和 \(out_e\),\(in_e \to out_e\) 连长度为边权的边。
对于一个原图中的点 \(u\),取出所有连向它的边的出点,和从它连出的边的入点,显然所有的出点都要向入点连长度为 \(dep(lca)\) 的边。
设上面提到的两类点组成并集 \(S\),\(\sum |S| = O(m)\),所以考虑 \(O(|S|)\) 处理这类边。将 \(S\) 中的点按照 trie 树上的 dfs 序排序,则有经典结论:设 \(h_i\) 表示 \(S_i\) 和 \(S_{i+1}\) 的 \(dep(lca)\),那么任意两个点的 \(dep(lca)\) 就是对应的那段区间的 \(h \min\)。
所以取出 \(h \min\) 的位置,所有左侧出点向右侧入点连边、反向同理,然后递归下去连两侧的边就行了。
需要写一个双向的前后缀优化建图,建 \(4\) 排虚点就行了,并不难构造。
-
多项式 \(\ln\) 先省省吧。
-
LCT / 全局平衡二叉树 先省省吧。
-
矩阵 \(\max = v\) 的方案 $ = (\max \le v) - (\max < v)$ 的方案。
考虑 \(O(2^n)\) 枚举哪些矩阵是 \(\le v\),剩下的便是 \(< v\),进行容斥。暴力矩阵取 \(\min\) 的 \(O(2^n hw)\) 显然是过不了的,但是只要把坐标离散化一下,就可以很简单地做到 \(O(2^n n^2)\)。
-
勾 8。
-
勾 8。
-
打表。打表。
-
首先可以发现,最优状态必然满足每个连续段的状态都是一样的,可以压缩起来。用平衡树结点,对于插入,把对应的位置
split
出来,如果卡在了这一段的中间那么就要分裂开,小讨论一下就可以。对于求答案,维护 \(f(x, y)\) 表示子树内的第一个点在 \(x\) 状态,最后一个点在 \(y\) 状态(非严格),最大价值。
update
的时候就是 \(f(x, y) = \max \{ f_L(x, k) + f_R(k, y) \}\)。 -
支持单点修改维护全局
sort
后的 \(\sum |a_i- b_i|\)。先把坐标全部离散化了,设一段边的左边有 \(x_i\) 辆车,\(y_i\) 个加油站,那么这条边对答案的贡献就是 \(|x_i - y_i| \times len\)。
令 \(\Delta = x_i - y_i\),那么一次修改就相当于是区间的 \(\Delta + 1 / - 1\)。将坐标轴分块,块内 \(\Delta\)
sort
一下,则修改零散块就暴力重构,修改完整块就打标记并二分查找到零点计算贡献。时间复杂度 \(O(n\sqrt{n}\log n)\)。 -
no 卷积 /oh。
-
考虑暴力 dp,\(f(i, x, l, r)\),表示 \(a_{i-1} = x\),\(\le x\) 的最大的是 \(l\),\(\ge x\) 的最小的是 \(r\),方案数。转移显然,时间复杂度 \(O(nr^4)\)。
发现转移好像可以差分优化(或者是考虑逆推就可以使用前缀和)所以 \(O(nr^3)\) 即可通过。
-
考虑二分答案后,可以求出每个位置至少被加几次。
从左到右扫描,如果一个点需要被加,那么取出涵盖它的右端点最远的区间进行一次操作即可。
-
一种做法是随机赋值,使得同种颜色的所有位置对应的值异或起来是 \(0\),这样求一个异或前缀和之后,所有异或和为 \(0\) 的区间就是合法的区间。
考虑靠谱的做法,枚举区间的右端点 \(r\),每个颜色对应的区间 \([x, y]\) 只有三种情况:
-
\([x, y]\) 已经全部在 \(r\) 之前出现,则可以转化为一个限制:\(l \in [x+1, y]\) 都是不合法的。
-
\([x, y]\) 完全在 \(r\) 之后,到此为止一点没出现,那就不管它了。
-
\([x, y]\) 横跨了 \(r\),那么需要找到 \(r\) 左边的最后一个位置 \(p\),使得它对应颜色的右端点超过了 \(r\),\(l\) 只能在 \([p+1, r]\) 取值。
所以线段树支持区间赋值、区间求和即可。
-
-
线段树优化建图的 \(O(n \log n)\) 做法很显然。
或者是发现爆炸的必然是一段区间,考虑对每个 \(i\) 求出 \(l_i, r_i\) 表示爆炸的范围。计算 \(r_i\) 时,看看 \(i\) 能不能炸掉 \(i+1\),如果可以,比较 \(i\) 和 \(i+1\) 哪个炸得远。如果是前者,那么 \(i+1\) 此后就没用了,弄个链表之类的把它缩掉;否则 \(r_i\) 直接继承 \(r_{i+1}\) 即可。剩下的部分完全同理。
时间复杂度 \(O(n)\)。
-
过难。
-
震撼。
-
将询问差分为 4 个有关前缀和的形如 $ \sum_{i=1}^{+\infty} get(1, x, i) \times get(1, y, i) $ 的询问,莫队维护即可。时间复杂度 \(O(n \sqrt{n})\)。
-
\[f_i = i^k + \sum_{j < i} f_j \]
把 \(i^k\) 表示为 \((i-1)+1\) 用二项式定理拆开,再增设 \(g_i =\sum_{j \le i} f_j\),很容易构造矩阵乘法转移。时间复杂度 \(O(k^3 \log n)\)。
-
\(f(i, j)\) 表示前 \(i\) 个花了 \(j\) 块钱,最多多少个,随便背包转移。
最后输出 \(\ge M\) 的最小的 \(j\) 就行了。
-
首先容易转化为 \(G = 1, L = n\),值域 \(1 \sim n\) 的情况。
因为 \(\omega \le 8\),用一个 \(16\) 位二进制数压缩数 \(x\),前 \(8\) 位表示的 \([v_p(x) = 0]\),后 \(8\) 位表示 \([v_p(x) = v_p(n)]\)。现在就是要选择若干个状态或起来,使得得到全集。
发现状态其实是不多的,不同的二进制串只有 \(600\) 种左右,所以考虑分类之后 dp。如果没有 \(x\) 的限制,直接 \(f_{i, j}\) 表示考虑了前 \(i\) 类,得到状态 \(j\),选了第 \(i\) 类的方案数是 \(2^c - 1\),不选是 \(1\)。
加上 \(x\) 的限制后,可以考虑预处理 \(f_{i, j}\) 和 \(g_{i, j}\)(其中 \(g\) 表示考虑了后 \(i\) 类),拿 \(f\) 和 \(g\) 做一个 OR 卷积合并后,乘上 \(x\) 所在类的方案数 \(2^{c-1}\) 即可。可以使用 FWT 实现。
-
考虑 Nim 游戏先手获胜的条件是异或和不等于 \(0\)。
所以这题如果想让 Alice 失败,也就是要让她第一次操作无法使得异或和为 \(0\)。换言之,设第一次操作 \(x\),则剩下堆的异或和应当大于等于 \(a_x\)。
枚举 \(x\),然后做 dp,设 \(f(i, j)\) 表示考虑前 \(i\) 堆,选出若干堆使得异或和为 \(j\) 的选法,直接转移。
时间复杂度 \(O(n^3)\)。
-
先调和级数 \(i\) 向所有倍数 \(ki\) 连边,然后 \(w\) 向 \(e\) 连边,缩点之后,看有哪些 \(w, e\) 在同一个 SCC 中即可。
-
显然合法配对至多 \(2n\) 个,很容易预处理出来。
然后离线之后树状数组简单维护就行了。
-
魔改矩阵乘法,\(\times\) 改成 \(\land\),\(+\) 改成 \(\lor\),套板子就行了。
正确性(结合律)感性上很好理解。
-
用两个
bitset
分别维护前缀出现过的数和后缀出现过的数,枚举中间数,相应位置交起来看看存不存在就行了。亦可 FFT。 -
按照题意模拟就行了,就是步骤有点多。暴力建虚树 \(O(Qn)\) 是可过的。
当然写漂亮一点完全可以做到 \(O((m + \sum num) \log n)\)。