2024.3.5 - 3.8
Tue
string
给定一个字符串 \(S\),我们对 \(S\) 跑 KMP 算法可以求解 \(\text{fail}_i\) 数组,将 \(i\) 与 \(\text{fail}_i\) 连边,定义 \(0\) 号节点的深度为 \(-1\),则 \(f(S)\) 为这棵树的深度和。
给定一个字符串 \(T\),对每一个 \(i\in [1, |T|]\) 求 \(T\) 中长度为 \(i\) 的前缀的所有子串的 \(f\) 之和。
\(1\leq |T|\leq 10^5\)
(补题,题解源自官方题解)
不妨对每一个 Border 算贡献,考虑两个相等的子串 \(S_{[i,i+k-1]}, S_{[j,j+k-1]}\),那么它可以给所有满足 \(l=i,r\in [j+k-1,n]\) 的子串带来 \(1\) 的贡献。
求前缀的所有子串,可以简单变为求以给定右端点结束,然后前缀和一遍。
在右侧增加一个字符 \(T_i\) 的时候,以 \(i\) 结束的子串较 \(i-1\) 的子串多出的答案是所有相同的子串对数(串长增加了 \(1\))。
然后用 SAM 建立 parent 树,维护相同的子串对数。增加一个字符时,对应一条 parent 树上的链,树剖维护即可。
wind
【2024省选联考】
从原点出发,给定 \(n\) 个坐标偏移量 \((\Delta x_i,\Delta y_i)\),每一天你可以决定一个行走距离 \((\Delta x', \Delta y')\),需要满足 \(|\Delta x'| + |\Delta y'|\leq k\),如果你的当天的初始位置为 \((sx,sy)\),那么你今天可以到达 \((sx + \Delta x_{i\bmod n} + \Delta x', sy + \Delta y_{i\bmod n} + \Delta y')\),这将成为第二天的初始位置。
走到目标位置 \((tx,ty)\) 的最少天数 \(m\) 是多少?
\(\sum n\leq 10^6, 0\leq |tx|,|ty|,|\Delta x_i|, |\Delta y_i|, k\leq 10^8\)
如果枚举 \(m\),那么假设受到偏移的影响最后要走的距离分别为 \(D_x, D_y\),那么平均下来每天要走的是 \(\dfrac{D_x}{m} + \dfrac{D_y}{m}\),应当 \(\leq k\),否则无解。
容易想到对 \(m\bmod n\) 进行分讨,令 \(a=n\),此时 \(m = ax + b\),枚举的量是 \(b\)。
对于一整组坐标偏移量造成的总影响,\(Sx\) 表示 \(x\) 的偏移,\(Sy\) 表示 \(y\) 的偏移,考虑符号。
对于一段前缀坐标偏移量造成的总影响,\(Px_i\) 表示 \(x\) 的偏移,\(Py_i\) 表示 \(y\) 的偏移,考虑符号。
那么最终的式子为:
不妨再令 \(p = -Sx, q = tx - Px_b, r = -Sy, s = ty - Py_b\)
分讨绝对值计算最小非负整数解,时间复杂度 \(\mathcal{O}(\sum n)\),这种数学题常数比较大。
附解不等式 \(ax+b \ge 0\) 的整数解的参考程序:
inline pair<long long,bool> solve(long long a,long long b)
//若 bool 返回 1 则表示 x>= 某个值,否则 x<= 某个值
{
if(a==0)
{
if(b>=0)
return make_pair(-inf,1);
return make_pair(inf,1);
}
if(a>0)
{
if(b>=0)
return make_pair(-b/a,1);
return make_pair((-b+a-1)/a,1);
}
if(b>=0)
return make_pair(b/(-a),0);
return make_pair(-(-b-a-1)/(-a),0);
}
数字表格
【SDOI2017】
做道数学题放松一下
令 \(f_i\) 表示斐波那契数列,满足 \(f_0=0, f_1=1\),且对于 \(i\ge 2\) 有 \(f_i = f_{i-1} + f_{i-2}\),有 \(T\) 次询问,每一次询问给出 \(n,m\),试求如下表达式的值:
其中 \(\gcd(x,y)\) 表示 \(x,y\) 的最大公因数,答案对 \(10^9 + 7\) 取余。
发现 \(f_{\gcd(i,j)} = \gcd(f_i,f_j)\),没有什么用,可以增加难度。
以下令 \(n\leq m\),若 \(x\) 是个数字则令 \([x]\) 表示 \(\lfloor {x} \rfloor\)。
其中:
代入原式,可得:
令 \(T=kx\),可得:
中间部分不好算,预处理,然后整除分块,带快速幂,令 \(P\) 为模数,指数对 \(P-1\) 取余。时间复杂度为 \(\mathcal{O}(n\log P + T \sqrt{n}\log P)\),中间项预处理复杂度是调和级数 \(\mathcal{O}(n \ln n)\)。
附:关于令 \(T=kx\) 这一思想已经忘了好几次了……
Wed
To Learn
博弈论相关、Z 函数、矩阵树定理、BEST 定理、FWT、网络流与2-SAT的各种模型、莫队(回滚与二次离线)、较难分块、树上莫队与树上分块、点分治&点分树。
PAM、SA&SAM、ACAM、四边形不等式与决策单调性优化 DP、Slope-Trick、图计数、树套树、Splay&LCT、线性代数、计算几何、左偏树与 KD-Tree、多项式科技与生成函数、扫描线。
组合数学、Lucas(尤其套数位DP)、min25筛、杜教筛、莫比乌斯反演、Miller-Rabin&Pollard-Rho、随机化技巧、高维前缀和(或)。
(部分为未熟练掌握)
maze
【2024省选联考】
给定一个完全二叉树,非叶子节点有控制费用 \(w_i\),叶子节点有权值 \(q_i\),可以花费一个非叶子节点的控制费用 \(w_i\),强制先走左子树,再走右子树,否则任意决定左右顺序。
每到达一个叶子节点,则向序列 \(Q\) 后面追加该叶子节点的权值。
Alice 有 \(K\) 点费用,她希望字典序最大,她可以选择控制哪些节点。Bob 将在 Alice 选择所有控制节点后开始决定一种二叉树的遍历顺序,要求:
- 每遍历到某个节点时,如果被控制则先走左子树,再走右子树;否则任意决定先走左子树还是右子树,最后返回父亲节点,当返回到父亲节点后无法再来。
- 每个叶子节点将被遍历恰好一遍。
Alice 希望 \(Q\) 的字典序最大化,Bob 希望 \(Q\) 的字典序最小化,问 \(Q\) 最终的取值。
设 \(n\) 表示二叉树的层数,则 \(1\leq \sum 2^n \leq 10^5, 1\leq w_i, K\leq 10^{12}\),且 \(q\) 是一个 \(2^n\) 的全排列。
【我不会,题解源自他人】
要求字典序最小,则可以贪心放最小的,具体如何求最小的,则二分,考虑 Alice 可以做到控制无法走到的最大数字是 \(v\),二分之,check 则使用 DP:
- 记 \(f_i\) 表示考虑到节点 \(i\) 的最小花费。
- 如果这是一个叶子节点,若 \(q_i\leq v\) 花费为 \(\infty\),否则为 \(0\)。
- 否则,\(f_i = f_{l_i} + \min (f_{r_i}, w_i)\)。
然后向 \(Q\) 追加 \(v\),随后找到 \(v\) 所在的叶子节点,从下到上依次考虑每一个祖先 \(f\),同时维护剩余费用 \(k\):
- 考虑另一棵子树,计算花费 \(r\)。
- 如果它本身在右子树,则可以省去 \(r\) 的花费。
- 否则,如果 \(k + w_i \ge r\),则可以省去 \(\min(r, w_i)\) 的花费。
跳蚤
【HNOI2002】
求有多少个长度为 \(N\),值域为 \(M\) 的正整数序列 \(A\) 满足如下条件:
- 从位置 \(x\) 出发,每次从 \(A\) 中选一个数字或者选择 \(M\),令 \(v\) 表示选择的数,向左或向右走 \(v\) 格,最终可以到达位置 \(x-1\)。
\(1\leq N\leq M\leq 10^8, M^N\leq 10^{16}\)
根据裴蜀定理,有 \(\gcd(A_1,A_2,\cdots,A_N,M)=1\),证明:
- 设 \(d=\gcd(A_1,A_2,\cdots,A_N,M)\),则最终到达的位置 \(p\) 满足 \(p = x + kd(k\in \mathbb{Z})\),而 \(x-1 = x+ kd\) 显然有 \(d=1\)。
于是最终式子变为:
暴力计算 \(\mu\) 的值,暴力求幂,时间复杂度 \(\mathcal{O}(Nd(M)+\underset{k\mid M}{\sum} \sqrt{k})\),其中 \(d(M)\) 表示 \(M\) 以内的最大因数个数,本题取到 \(768\),求和式部分被其他人证明是 \(\mathcal{O}(\sqrt{Md(M)})\) 级别的。
ABC343
A. 随便做,发现 \(10\) 是偶数,拿 \(9-\) 正确答案,拿答案异或 \(1\)……都可通过,复杂度 \(\mathcal{O}(1)\)。
B. 模拟,输出每一行值为 \(1\) 的下标,复杂度 \(\mathcal{O}(n^2)\)。
C. 枚举每一个完全立方数暴力判断即可,复杂度 \(\mathcal{O}(\sqrt[3]{n})\)。
D. 用 set
和 map
实时维护数字种类数,复杂度 \(\mathcal{O}(T\log_2 n)\)。
E. 性质题,发现任意两个正六面体交出来的部分也是正六面体,分别算出被恰好 \(1,2,3\) 个立方体覆盖的体积,枚举两个立方体的左下角坐标,范围 \([-7,7]\),记 \(a=15\),复杂度为 \(\mathcal{O}(a^6)\)。
F. 经典线段树,令 info
类维护最大值、最大值出现次数、严格次大值、严格次大值出现次数,合并即可,复杂度为 \(\mathcal{O}(q\log_2 n)\)。
G. 状压DP,先把属于子串的所有字符串全部判掉(相等可以全部保留),然后对剩下的字符串 \(c_{i,j}\) 表示把 \(t_j\) 接在 \(t_i\) 后面的最长重叠部分,前面的部分可以全部用 Hash 解决,记 \(f_{S,i}\) 表示考虑了集合 \(S\) 中的所有字符串且以 \(t_i\) 结尾的最短长度,复杂度为 \(\mathcal{O}(n\sum |S|+n^22^n)\)。
取石子游戏
【GZOI2017】【博弈论入门练习】
给定 \(n\) 堆石子,请问有多少种钦定石子堆与先手开局选的石子堆的方案使得后手必胜,答案对 \(10^9+7\) 取余。
\(1\leq n, c_i\leq 200\),其中 \(c_i\) 表示每一堆的石子数量。
考虑单堆 Nim 游戏的 SG 函数有 \(SG(n)=n\),根据 SG 定理有 \(m\) 堆石子的游戏 \(X\) 满足 \(SG(X)=SG(c_1)\oplus SG(c_2)\oplus \cdots \oplus SG(c_m)\),当 \(SG=0\) 时当前行动方必败。
首先考虑选出来的石子本身 \(SG=0\),此时需要记录选择的石子堆数,记 \(f_{i,j,k}\) 表示考虑到了第 \(i\) 堆,选了 \(j\) 堆,当前 \(SG=k\) 的方案数:
- 初态:\(f_{0,0,0}=1\)。
- 转移:
- 该堆不选,则 \(f_{i,j,k}\gets f_{i,j,k} + f_{i-1,j,k}\)。
- 该堆选,满足 \(j > 0\),则 \(f_{i,j,k}\gets f_{i,j,k} + f_{i-1,j-1,k\oplus c_i}\)。
- 答案:\(\underset{1\leq i\leq n}{\sum} f_{n,i,0}\times i\)。
若石子本身 \(SG\ne 0\),但是我们钦定使得先手一步无法达到 \(SG=0\) 的局面导致后手必胜,此时不妨枚举第一堆,把它扔掉,考虑其余 \(n-1\) 堆,设 \(g_{i,j}\) 表示考虑到第 \(i\) 堆,当前 \(SG=j\) 的方案数:
- 初态:\(g_{0,0}=1\)。
- 转移:
- 该堆不选,则 \(g_{i,j}\gets g_{i,j} + g_{i-1,j}\)。
- 该堆选,则 \(g_{i,j}\gets g_{i,j} + g_{i-1,j\oplus c_i}\)。
- 答案:首先令该堆有 \(k\) 颗石子,那么 \(SG\) 满足 \(\exists p\in [0,k), SG\oplus p = 0\) 都可以被取完,所以不应计算,但是当 \(SG = k\) 时,此时最终 \(SG = 0\),这会与 \(f\) 计算重掉,省掉 \(f\) 或是不考虑 \(SG = k\) 的答案均可。
Thur
xor
【2024省选联考】
给定 \(n\) 个在 \([0,2^k)\) 内的非负整数 \(a_i\),修改一个数的计权方式的代价为 \(b_i\),选择一个在 \([0,2^k)\) 内的非负整数 \(x\),最终的权值 \(W\) 为所有未修改计权方式的 \(a_i\oplus x\) 的最小值与所有修改计权方式的 \(a_i + x\) 的最小值中的较小者,你有 \(m\) 点费用,最大化 \(W\) 的值,其中 \(\oplus\) 表示按位异或运算。
\(1\leq n\leq 10^5, 1\leq k\leq 120, 0\leq m, b_i\leq 10^9\)。
【我不会,题解源自他人】
首先考虑一种特殊情况:可以修改所有数字的计权方式,此时的 \(W\) 就为 \(\min\{a_i\} + (2^k -1)\),否则 \(W < 2^k\)。
把所有数字挂到 Trie 上,从高位往低位挂,并从高位往低位确认 \(W\) 的值。
考虑到某一位,我们需要决策 \(x\) 的值,分为 \(x=0\) 与 \(x=1\),对每一种取值分别决策 \(S\),最终 \(S\) 影响 \(W\) 的结果。
- 如果我们希望 \(W\) 在该位为 \(1\)。
- 如果 \(x=0\),左子树中的 \(\oplus\) 贡献的权值为 \(0\),而右子树的 \(\oplus\) 贡献的权值为 \(1\),那么左子树的所有权值需要全部修改计权方式,如果费用足够,且当前所有需要修改计权方式的最小值 + \(x\) 当前能取到的最大值比当前答案的最小可能值要大,才可以成功将 \(W\) 该位修改为 \(1\),并递归右子树处理。
- 如果 \(x=1\),将上述对称即可。
- 如果成功将 \(W\) 该位的权值置为 \(1\),忽略后面的计算。
- \(W\) 该位的权值置 \(0\)。
- 如果 \(x=0\),抛弃右子树,递归左子树处理。
- 如果 \(x=1\),将上述对称即可。
Trie 各节点维护子树 \(a\) 的最小值与 \(b\) 的总和。
于是最终复杂度为 \(\mathcal{O}(\sum nk)\),最多把整棵 Trie 遍历一遍。
附:看懂了之后感觉比 D2T1 简单……
矩阵树定理初探
小Z的房间
【HEOI2015】
给定一张网格图,部分位置有障碍,记有 \(k\) 个格子无障碍,求有多少种选择 \((k-1)\) 对相邻格子的方案数使得任意两个无障碍的格子都可以通过选定的相邻格子互相可达。
答案对 \(10^9\) 取余。
\(n,m\leq 9\)。
发现就是求网格图的生成树个数,上板子即可。
生成树
【中山市选】
求图 \(G(n)\) 的生成树个数,其中 \(G(n)\) 表示一个正 \(n\) 边形,每一条边都与一个正五边形相邻,任意两个正五边形不相邻的图。
\(n\leq 100\),可以做到 \(n\leq 10^{18}\)。
正 \(n\) 边形需要断一条边,与该边相邻的正五边形需要从 \(4\) 条边中断一条,剩余的 \(n-1\) 个正五边形需要从 \(5\) 条边中断一条,于是答案为 \(4n\times 5^{n-1}\)。
轮状病毒
【FJOI2007】
求图 \(G(n)\) 的生成树个数,其中 \(G(n)\) 表示一个 \(n+1\) 个点的菊花图,相邻两个叶子节点之间都有边相邻的图。
\(n\leq 100\),可以做到 \(n\leq 10^{18}\)。
令该图的 Laplace Matrix 为:
答案为 \(\det(M)\)。
运用矩阵树定理,消掉第一行第一列进行计算。
然后……然后就没有然后了……先研究一下……我还不太会……
最终答案可以递推,设 \(f_0=0, f_1=1\),且对于所有 \(i\ge 2\) 有 \(f_i = 3f_{i-1} - f_{i-2} + 2\),套一个高精度即可。
Fri
黑暗前的幻想乡
【SHOI2016】
给定 \(n\) 个点,\(n-1\) 种颜色,每种颜色有一些边,求 \(G\) 有多少生成树满足任意两条边颜色不同,答案对 \(10^9+7\) 取余。
\(1\leq n\leq 17\)。
考虑容斥,我们可以算出任意颜色组合的生成树个数,使用 Matrix-Tree 定理求解。
枚举所有可能的颜色组合,乘上对应的容斥系数即可。
时间复杂度为 \(\mathcal{O}(2^{n-1}(n-1)^3)\)。
重建
【SDOI2014】
给定一个 \(n\) 个点的图 \(G\) 中每条边的出现概率,保证无自环,求 \(G\) 是所有生成树的出现概率之和,答案保留浮点。
\(1\leq n\leq 50\)。
先记 \(T\) 是 \(G\) 的一棵生成树,\(e\) 是 \(G\) 中的一条边,\(p_e\) 表示该边出现的概率,答案为:
发现不好处理,记 \(P = \underset{e\in G}{\prod} (1-p_e)\),则答案为:
发现 \(1-p_e=0\) 的情况存在,加上 \(\text{eps}\) 即可。
最小生成树计数
【JSOI2008】【JSOI2010】
求 \(G\) 中的最小生成树个数。
\(n\leq 100, m\leq 1000\)。
引理 1. 对于 \(G\) 中所有最小生成树,对应边权 \(w\) 的所有边造成的连通方式是一样的。
于是我们可以依次考虑每一种权值的边,设当前考虑到了边权为 \(w\) 的边,那么先合并最小生成树中边权不为 \(w\) 的边,然后对合并后的图做 Matrix-Tree。
设边权为 \(i\) 的边有 \(c_i\) 条,将生成树划分成 \((c_i+1)\) 个连通块,时间复杂度为 \(\mathcal{O}(c_i^3)\),故总时间复杂度为 \(\mathcal{O}(\sum c_i^3)\leq \mathcal{O}((\sum c_i)^3) = \mathcal{O}(n^3)\)。