B
给洛谷的题解先放到这里
首先能想到一个结论:尽可能消去更大的数时最优。
形式化的表达是:对于数 $a_j$ ,显然至多有一个 $i$ 满足 $i<j$ 且 $a_i+a_j=2^k$ ,如果不消去数对 $(a_i,a_j)$ ,则 $a_j$ 不可能被消去,最终答案不会更优。
再考虑题目中的 $2^t$ 以及 $A_i\leq 10^9$ ,则有 $a_i+a_j\leq 2^{30}$ 。
那么枚举范围内的所有 $2^t$ ,尺取法取当前符合条件的数对出来即可。
1 | const int N=2e5+100; |
C
$N$ 个字符串排成一排,对于 $1\leq i\leq N$ ,$S_i$ 的字典序应小于 $S_{i+1}$ , $S_i$ 的长度为 $A_i$ ,求满足上述条件的的最小字符集的大小
答案显然能被二分出来,设字符集大小 $\sum_0$ ,判断是否能用 $\sum_0$ 使这些串的字典序递增
注意:判断有局部贪心,即,对于 $1\leq i\leq N$ , $S_i=\Xi$ 使后面的串可以被构造,那么对于 $\forall \Xi’<\Xi$ ,若 $S_i=\Xi’$ 后面的构造仍可以被完成
$S_i$ 即为大于 $S_{i-1}$ ,长度为 $A_i$ 的最小字符串即可
考虑如何构造 $S_i$:
若 $A_{i-1}<A_i$ ,在后面补 $A_i-A_{i-1}$ 个 $a$ 即可,即 $S_i=S_{i-1}+a^{A_i-A_{i-1}}$
否则,取 $S_{i-1}$ 的一个长度 $A_i$ 的前缀,将最后一个字符向后移,即,$eg:a\rightarrow b$
这里要考虑溢出的问题,即 $z\rightarrow ?$ 此时考虑进位,即 $az\rightarrow ba$
构造每个字符串的时候,新增的非 $0$ 位置最多增加一个,$O(n\log n)$
1 | const int N=2e5+100; |
E
给定一个 $n$ 顶点的树,在点 $v$ 需要回到点 $1$ ,过程中会选择并访问一个当前没有访问,但与访问过所有点相邻的点中编号最小的点,求回到点 $1$ 时经过了多少跳不同的边
首先显然有 $边数=点数-1$
设集合 $S_v$ 为 $v\rightarrow 1$ 所经过点的集合,那么显然有 $S_{fa_v}\in S_v$ ,可以考虑这两者之间的关系
设 $pmax_v$ 表示路径 $v\rightarrow 1$ 中点标号最大的点,而当 $pmax_v=v$ 时,点 $v$ 被称为极大点
考虑点 $v,fa_v$ 是否为极大点:
$v,fa_v$ 均不是极大点:
显然此时有 $S_v=S_{fa_v}$
$v$ 是极大点:
此时,显然路径 $fa_v\rightarrow 1$ 中不会经过 $subtree(v)$
但对于路径 $v\rightarrow 1$ 来说,会经过 $v$ 的子树中那些编号小于路径中点编号的点,形式化的,会经过集合 $B_v=\{u\mid u\in subtree(v) \wedge \max(u,fa_u,fa_{fa_u},…)<pmax_{fa_v} \}$ 中所有的点
此时有 $S_v=S_{fa_v}\cup B_v$
$fa_v$ 是极大点
此时,$v$ 子树中所有 $pmax_u=fa_v$ 的顶点 $u$ 都会被访问,有集合 $A_v=\{u\mid u\in subtree(v) \wedge pmax_u=v\}$ ,而对于极大点,有 $B_v\in A_v$
那么有 $S_v=S_{fa_v}\cup \left(A_{fa_u}\cap subtree(v)\right)$
可证明:$S_{fa_v}$ 与 $A_{fa_v}\cap subtree(v)$ 不相交,则可以直接加
直接搜就可以
1 | const int N=2e5+100; |
F
给定 $n-1$ 个点集,从每个集合内选两个点连边,使最后形成一棵树,输出方案
考虑如何构成树:固定点 $rt$ 为根,整张图除去 $rt$ 之外的所有点和点集存在完美匹配,即:一张二分图,左边是除 $rt$ 以外的所有点,右边是点集 $E_{1\sim n-1}$ ,点 $v$ 与 $E_i$ 连边当且仅当 $u\in E_i$ ,该图存在完美匹配
但如此固定后的完美匹配不一定有解,且 $N\leq 10^5$ 无法维护 $\text{Hall}$ 定理
,故有以下构造方案:
首先固定根,得到一个匹配,设 $E_i$ 的匹配对象为 $e_i$ ,然后从所得的根 $\text{bfs}$ ,具体的,对于当前树上的点 $v$ ,寻找所有满足 $v\in E_i$ 的集合并将其对应的 $e_i$ 作为 $v$ 的子节点,如果所有顶点均被加入树种,则答案显然正确
那么,找图的完美匹配即可
1 | const int N=1e5+100; |