A. 自适应树游走协议
简单题。
复杂度 O(n)。
B. 简单的数学题
先做基本变换:
====i=1∑nj=1∑i⌈ji⌉[gcd(i,j)=1]i=1∑nj=1∑i⌈ji⌉g∣gcd(i,j)∑μ(g)g=1∑nμ(g)i=1∑n[g∣i]j=1∑i[g∣j]⌈ji⌉g=1∑nμ(g)i=1∑n/gj=1∑i⌈gjgi⌉g=1∑nμ(g)i=1∑n/gj=1∑i⌈ji⌉
后面的求和式仅跟 n 有关。
令 S(n)=i=1∑nj=1∑i⌈ji⌉ ,实际上只需要 S(n/i) 的值,而 n/i 的个数为 O(n) 。
考虑快速单点求值:
发现其为二重求和式,即枚举的是下三角的点对 (i,j) ,因此往合并贡献的方向去思考。
当 ⌈ji⌉ 小于等于 n ,枚举上界 w ,计算 ⌈ji⌉≤w 的点对个数。
⇒⇒⌈ji⌉≤wi≤wj⌈wi⌉≤j
即 ⌈ji⌉≤w 的 (i,j) 个数为 i=1∑ni−⌈wi⌉+1 (官方题解给的式子有误)。这个明显可以 O(1) 求得。 建议自己封装向下取整,向上取整变动上指标的前缀和函数 ,省很多事。
那么等于 w 的个数即为前缀和做差。
枚举 w 的复杂度为 O(n) 。
当 ⌈ji⌉ 大于 n ,意味 j≤n ,此时枚举 j (practical 的建议是, j 枚举到 ⌈jn⌉≤n 停止,避免细节处理)
j=1∑n+5[⌈jn⌉>n]i=j∗n+1∑n⌈ji⌉
同样也是前缀和做差。
复杂度 O(n) 。
很明显不能在数论分块时在线求 S(n/i) 的值。需要预处理一部分的 S(i) 。
考虑预处理前 n2/3 的 S ,计算一下后面在线计算的复杂度:
n/i≥n2/3⇒i≤n1/3 ,即有 n1/3 的点大于等于 n2/3 。
复杂度为 O(i=1∑n1/3)n/i ,用积分近似计算复杂度:
$O(\int\limits_{i=1}{n{1/3}} \sqrt{\frac{n}{i}}) = O(n^{2 / 3}) $ 。满足要求。
因此考虑如何预处理前 n2/3 的 S :
S(n)=i=1∑nj=1∑i⌈ji⌉=i=1∑nj=1∑i⌊ji−1⌋+2n∗(n+1)=i=1∑n−1j=1∑i⌊ji⌋+2n∗(n+1)
前面的二重求和式可以类比杜教筛。具体的,把 i/j 看做积性函数 1 的前缀和。即 j=1∑iji=j=1∑i(1∗1)(j)=j=1∑id(j) 。
故 i=1∑n−1j=1∑i⌊ji⌋ 为积性函数 d 的二维前缀和,可以线性递推。
那么最后数论分块就做完了。
复杂度 O(n2/3) 。
C. 困难的数学题
递推方程 f(i)=1+j=k∑if(j−k)
复杂度为 O(n) 。
夹带一点私货:
这题也可用该方法做,复杂度 MlogM 。需要套个 MTT 。
D. 平衡的字符串
考虑模 k 余数相同的位置,判断一下即可。
复杂度 O(n) 。
E. 不平衡的字符串
由于 a/b≥1/2 ,而 k 必须大于 a/b ,故同一子串不会有不同字符同时满足条件。子串长度用 i - j + 1 表示,子串中字符的个数用 pre_i - pre_{j-1} 表示,就变成了两个点的 trivial BIT 题。
复杂度 O(nmlogn) (实际根本达不到满的复杂度)。
F. 值钱的项链
水题。
G. 自行车调度
费用流裸题。
H. 三阳开泰
令 f(i,j,k) 表示第 i 位二进制, a,b,c 是否到上限的状态 j , ab,bc,c^a 是否到上限的状态 k 的个数。
数位 dp 板题。
I. 图中修边
方案可行与否仅跟连通块有关。
deg <= 2 的特判一下。
发现大于等于 3 的完全图删不了;没有奇数度的点的连通块也会删出环来(搭边的过程,就是其中两个点的度数不变,另一个店的度数-2,故整个图的度数集合奇偶性不变)
上述两个结论是充分必要的,判一下就完事。
复杂度 O(n+m+αn) 。
J. 下围棋
首先原游戏由独立的子树游戏构成,子树的 SG 值异或一下就是答案。
子树的游戏可转化为有根树删一个点,该点代表的子树就删除。花几个图,可猜测一颗树的 SG 值应为子树的 SG 值异或和 + 1。
复杂度 O(n) 。