T1:
法一:\(O(n^2)\) 的 DP。\(dp[i][j][0/1]\) 表示在 \(i\) 的子树内染色,\(i\) 是红/黑,使得每个要求的结点的黑点个数都等于 \(j\)。
法二:\(O(n)\) 的神秘做法。取出最浅的被要求结点,把深度 \(\le\) 它的都染成黑色,其余点都染成红色。
T2:
对于一个元素属于 \([0, 2^m)\) ,且互不相同的长度为 \(n\) 的整数序列 \(a_1,a_2,\cdots, a_n\),定义它的特征序列为序列 \(p_0, p_1, \cdots, p_{2^m−1}\),其中 $p_i $表示一个\(1\sim n\)范围的下标,使得 \(a_{p_i}\) 与 $i \(的**异或**值最大,即\)p_i = \arg \max_{(1\le j\le n)}\ a_j ⊕ i$,其中 \(⊕\) 为异或操作。
小 D 写出了一个满足要求的序列 \(a\),并求出了它的特征序列 \(p\)。不幸的是,小 D 把原序列弄丢了,而只剩下了特征序列 \(p\)。小 D 想要知道有多少满足要求的原序列 \(a\) 可以得到这个特征序列 \(p\)。因为答案可能很大,输出答案对 \(10^9 +7\) 取模的结果即可。
容易想到从高到低,每次确定一个位。
对于 \(p[l\sim r]\),如果左半边和右半边泾渭分明,则左半边涉及的 \(a\) 最高位都是 \(1\),右半边涉及的 \(a\) 最高位都是 \(0\),只有一种可能。然后各自递归进左右。
如果左半边的 \(a\) 和右半边完全相同,那这些 \(a\) 最高位取 \(0/1\) 都行,两种可能,然后递归进一边。
其他情况,无解。
但是有一种特殊情况无解是未被考虑的:如果有一个 \(a\) 没有在任何 \(p\) 出现,无解。
T3:
这个神秘的操作就是循环左移。不过这个操作是什么没什么关系。
发现如果小 Y 决定在第 \(i\) 次操作之后左移,其对 \(x\) 的影响和 \(x\) 是什么无关,只和 \(a_1\sim a_m\) 有关:可以求出一个数 \(t_i\),表示如果小 Y 决定在第 \(i\) 次之后左移,\(x\) 经过所有操作之后得到的答案是 \(x\bigoplus t_i\)。
把所有 \(t_i\) 插入一个 01-Trie 里,然后搜索。对于一个叶子,它的价值是从根到它的路径上只有一个儿子的结点对应的 \(2\) 的幂的和。例如如果 "从根到它的路径上只有一个儿子的结点" 有对应 \(2^4,2^1,2^0\) 的结点,那它的权值就是 \(16+2+1=19\)。
小 D 可能的最大价值就是叶子结点最大权值,方案数就是有多少个叶子取到这个最大值。
T4:
原题
做法和第一篇题解相同。