A. Apple Tree
考虑一个深度为 \(d\) 的点,若其为叶子,则最少需要的节点数也为 \(0 + 1 + 2 + \cdots + d\) 个点,所以说 \(d\) 是 \(\mathcal{O}(\sqrt{n})\) 的。
于是可以考虑直接对每个 \(u\) 记录下距离 \(u\) 为 \(i\) 的点数 \(f_{u, i}\),答案即为 \(\sum\limits_u \sum\limits_i \binom{f_{u, i}}{k - 1}\)。
求出 \(f_{u, i}\) 可以考虑换根,首先 \(f_{1, i}\) 是好求的,考虑 \(u\to v\) 的过程中,除 \(v\) 子树内的点的距离会 \(-1\),而其余的会 \(+1\),所以可以先平移一位,再单独重新处理子树内的贡献,这是因为 \(\sum siz = \sum dep\),所以这部分的复杂度也是 \(\mathcal{O}(n\sqrt n)\) 的。
注意特殊处理 \(k = 1\) 的情况。
复杂度 \(\mathcal{O}(n\sqrt n)\)。
submission。
B. Balatro
记 \(V = 100\)。
因为 \(\min(a_i, b_i)\le V\),考虑按照 \(a_i\) 与 \(V\) 的大小关系分类。
对于 \(a_i\le V\) 的类,做背包 \(f_{i, j}\) 表示选了 \(i\) 个物品 \(\sum a = j\) 的 \(\max \sum b\)。
对于 \(a_i > V\) 的类,一定有 \(b_i\le V\),所以类似的做背包 \(g_{i, j}\) 表示选了 \(i\) 个物品 \(\sum b = j\) 的 \(\max \sum a\)。
合并时枚举一类点选的个数和两边各自的 \(\sum a, \sum b\) 即可。
时间复杂度 \(\mathcal{O}(nkV + kV^2)\)。
submission。
D. Digit Division
一个很简单的想法就是让最后的数是若干个 \(k\) 的倍数拼接在一起的,这样一定是 \(k\) 的倍数。
不妨再简单一点,钦定最后的结构一定只有 \(1\) 个非 \(k\) 的数,直接枚举 \(k\) 的倍数根据数字和判断即可。
道理大概是倍数的数字和大概是比较随机的,且 \(k\) 大起来后 \(k\) 和其数字和差距是比较大的。
submission。
E. Euclid in Manhattan
感受一下路径,加上题目保证的 \(\max b, d\le \min a, c\),会发现路径应当是右上角左下角交替走的(也可能是从一个左下角开始)。
记 \(row_i = \sum\limits_{k = 1}^i a_k + b_k, col_j = \sum\limits_{k = 1}^j c_k + d_k\)。
记 \(f_{i, j}\) 表示当前在 \((i, j)\) 块的左下角的最短路径,\(g_{i, j}\) 表示当前在 \((i, j)\) 块右上角的最短路径。
借助定义可以写出转移:
- \(f_{i, j} + \sqrt{(b[i])^2 + (col_{k - 1} - col_{j - 1} + c_k)^2}\to g_{i + 1, k}\)。
- \(g_{i, j} + \sqrt{(row_{k - 1} - row_{i - 1} + a_k)^2 + (d[j])^2}\to f_{k, j + 1}\)。
这样就有了 \(\mathcal{O}(nm(n + m))\) 的做法。
回到原图考虑,例如 \(f_{i, j}\to g_{i + 1, k}\) 的转移,其实就是两行间加上距离转移,这个距离天然满足四边形不等式,所以具有决策单调性。
于是用二分队列的方法维护 dp 即可。
时间复杂度 \(\mathcal{O}(nm\log nm)\)。
submission。
F. Framboise 2
容易发现向左向右只能是每一行最靠左的元素向左,每一行最靠右的元素向右。
于是直接枚举两行共 \(4\) 种情况分别是否存在,就只需要考虑向上与向下了,这只需要看是否有被挡住,可以快速计算。
注意某一行可能不存在元素。
时间复杂度 \(\mathcal{O}(2^4 \times k)\)。
submission。
G. Goofy Songs
容易对 \(i, i + 1\) 判断出是否存在满足条件的串,如果与 \(i - 2, i - 1\) 的串相同则可以继承答案。
submission。
H. Heure de Rush
首先发现最小化移动过程的最大距离即可。
最后每个车的人数为 \(\sum\limits_{i = 1}^n h_i / n\)。
调整法,若 \(i < j\) 两个位置的人分别去了 \(i' > j'\),则让 \(i\) 去 \(j'\),\(j\) 去 \(i'\) 一定不劣。
所以按顺序每个人去到的位置一定不减,用指针维护分配人时当前还没分配完的车和该车还没分配的人数。
时间复杂度 \(\mathcal{O}(n)\)。
submission。
I. Infrared
考虑把光线的对称转成光线径直穿过而把之后的多边形全部根据当前边对称。
这样的好处是对称后起终点都是确定的,进而只需要判断是否合法了。
对于求出终点,考虑正着来想是经过一条边就把之后的多边形对称一次,是一个正向的过程,所以在反解出来终点时应该是倒着来,每次把终点关于当前边对称,一直对称到最后得到的就是终点。(有点类似于复合,当还原时应该是从最外层一步步解回去。)
此时知道了起点终点 \(S, T\),考虑判断是否合法。
首先来看第一条边,关于是否有交以及题目中 \(10^{-5}\) 的限制都是可以通过算交点 \(P\) 后检验的。
对于第二条边,此时应该检验的直线就不应该是 \(S, T\) 了,因为在过程中并没有对称这条边,而 \(T\) 是对称过的。
于是考虑按照光线的对称去做一轮对称,也就是令 \(S\) 为刚才算出的交点 \(P\),将 \(T\) 再关于第一条边对称,这样这条直线就相当于是从第一条边光线的交点开始往后做光线直接穿过对称多边形的操作,此时就是对的了。
这个题实在是有点不好说清楚,可以对着代码自己手玩一下。
时间复杂度 \(\mathcal{O}(n)\)。
submission。
J. JamBrains
首先考虑到这个过程依旧是有单调性的,也就是按照行从上至下,每一行从左至右考虑,进行完一次操作后的位置一定是单调不减的。
所以对于答案依然是可以二分的,也就是能到一行的位置肯定是个前缀。
接下来考虑如何找到最远的能到一行的位置,转化一下,考虑找到最近的不能到一行的位置。
会发现这其实就是最小的满足 \(i > u + 1, \sum\limits_{j = 1}^u s_{i - j}\le r\) 的 \((i, 1)\),因为向前跨过的步数不够多,所以向右回到了原点或者更远的地方,那么根据单调性之后也不可能向前走了。
且对于 \(\le i\) 行的点,因为向前跨过的步数足够多,所以每一步一定会向前走,走足够多步一定能到一行。
找到最小的 \(i\) 只需要写个线段树二分。
时间复杂度 \(\mathcal{O}((n + q)\log n)\)。
K. \(k\) Operations
考虑若选了 \(x(x > 1)\) 减一,对答案的影响是 \(\times \frac{x - 1}{x}\),\(x\) 越小这个值就越小(因为为 \(1 - \frac{1}{x}\)),所以每一步一定是选当前最小的值减 \(1\)。
于是对值域开可持久化线段树,对于每组询问分成三个部分,第一个部分是全部变为 \(1\),第二个部分是把最后 \(k\) 剩的一点给减了,第三个部分是处理到这里是 \(k = 0\) 已经减不了了,可以用线段树二分得到这个分界点,也可以二分的过程中直接把答案给算了。
时间复杂度 \(\mathcal{O}(n\log n + q\log n)\)。
submission。
L. Lice Hopping
首先感受一下答案不会很大。
首先有一个想法是从根 \(u\) 开始,对于一个儿子 \(v\) 先跳其二级子孙然后递归完其子树后跳到 \(u\) 的其他二级子孙最后再跳到 \(v\),然后再跳进另一个儿子的 \(v'\) 的子树(依然是跳到二级子孙)递归处理,这样每次递归完最深也是在 \(u\) 的二级子孙,最大距离一定 \(\le 3\)。
而答案 \(= 1\) 当且仅当树是一条链,所以只需要考虑判定答案是否为 \(2\),如果不是则答案为 \(3\)。
我写了一个很蠢的 dp,考虑如果子树内是一条路径,那么两个端点距离当前根的距离可以与 \(3\) 取 \(\min\)。
且发现如果一个点有 \(> 4\) 个非叶子邻点一定不合法。
所以可以把儿子子树共 \(4\times 4\) 种端点的方式是否存在记录下来,然后枚举路径经过的顺序(依次经过的子树,还有自己这个点),合并两条路径的方法类似矩乘。
有一个问题是要选择非叶子度数最大的点作为根做 dp 才是对的,具体原因我也不是很理解,或许是度数更小的点其实可能会有两条路径分别经过。
时间复杂度是线性带个巨大常数,按道理来说应该很不能过,但是实际上还是跑过了。
submission。
