得找个时间把 zr 题补补。。
A
考虑 \(f_{i}\) 只能拆为 \(f_{i-1}+f_{i-2}\),考虑拆 \(f_{i-1}=f_{i-2}+f_{i-3}\) 时,这条 \(f_{i-2} - f_{i-3}\) 的边在另一种方案时还是会被切掉,因此能切就切。
每次直接暴力遍历树找切边,由斐波那契数列的增长即可只复杂度为 \(O(n\log n)\)。
B
发现 \(n\) 很小直接 \(2^n\) 枚举绝对值负号 \(t_i\),那么有
\[\sum_{i=1}^{n} t_i(x_i-r_i)=(\sum t_ix_i)-(\sum t_ir_i) \]\[=(\sum t_ix_i)-(\sum t_{i} \sum s_{i, j} p_j)=(\sum t_ix_i)-(\sum p_{j} \sum s_{i, j} t_i) \]由于我们计算的是最大值,所以不合法的一定不优,根据排序不等式直接做就好了。
C
考虑每一行最前面一个,如果蓝色没有把某一个小的选上,那么第一列就一定会存在 红 < 蓝 不合法,因此按行首元素排序,一定是前 \(x\) 个蓝色后面全红。
枚举 \((x, k)\),判定条件变为左上角矩形最大值 < 左下矩形最小值 且 右上矩形最小值 > 右下矩形最大值,\(O(nm)\) 预处理即可。
D
在生成树的限制严格强于图,考虑如果一个端点没有被选择偶数次,那么其出边至少有一条被经过奇数次,此时答案为奇数次端点个数的一半(两两配对),否则直接走简单路径即可。
E
枚举 kruskal 排序分界点,每次暴力做一遍,询问二分计算多余贡献即可。
F
二分答案,check 时尽可能让当前数变小。
G
H/I
设 \(dp_i\) 为以 \(i\) 结尾的好序列个数
则 \(f_{i}=\min(f_{i-1}+1, a_i)\),所求为 \(\sum dp_i\)
不难发现,最后 \(f\) 可以表示为:
\(a_{x_1}, a_{x_1}+1, a_{x_1}+2 \dots a_{x_2}, a_{x_2}+1, a_{x_2}+2 \dots a_{x_i}, a_{x_i}+1, a_{x_i}+2 \dots\)
考虑修改,若 \(f_{i-1}+1\le a'_i\) ,则 \(f_{i}\),否则后面某段 \([i, x) (a_{x}<a'_i+x-i)\) 的 \(f_j\) 会变为 \(a'_i+j-i\),\(x\) 可以用线段树二分出来。
但是 \([x, n]\) 的贡献没有计算到,但是注意到 \(f_{x}\) 必然为 \(a_x\) (修改并不是真实修改)
我们考虑设 \(g_x\) 为当强制钦定 \(f_{x}=a_{x}\) 时,\(\sum_{i=x}^{n} f_i\) 的值,同理,\(g_{i}=g_j +\sum_{k=i}^{j-1} a_{j}+k-i\),其中 \(a_{j} < a_{i}+j-i\),仍然用上面的线段树二分即可。
J
状压,设 \(dp_{x, S}\) 为选择状态为 \(S\) 的最长合法前缀,预处理每个串不合法的位置计算贡献。
K
设 \(f_{i, j}\) 为还剩 \(i\) 个人,最大血量为 \(j\) 且最后全员白给无人胜利的方案数。