Loading

【题解】CTT 2020 Day 1

A. 术树数

注意到路径 + 环的组合仍然可行,因为我们可以在无影响的情况下加入环(显然一条边也算二元环)。而对于每条边,如果其在某些环内,只要保留任意一个就行(剩下的可以通过操作得出)。

于是只要用 k 进制线性基就做完了。提交记录:Submission #76089 - QOJ.ac

B. 树数术

考虑前段区间的 LCA 为 \(u\),在当前区间二分找到最后一个与 \(u\) 做 LCA 后会变的前缀,这段前缀一定不会成为答案,而在这段前缀之后的区间不受之前的影响。因此对于剩下的部分,预处理每个点往前走的最远距离,然后只需要数剩下区间中有多少数满足要求即可,是个二维数点。

提交记录:Submission #76130 - QOJ.ac

C. 述树术

Subtask #1

  • 首先考虑找到所有的叶子节点,注意到令 \(I\) 为全集,那么询问 \(I-\{x\}\) 得到的结果:如果是 \(n-1\),那么是叶子节点,否则就一定不是。
  • 这样就找到了所有的叶子,令叶子集合为 \(L\) 。接着就只需要考虑求出每个点的父亲了。注意到令 \(x\) 是某个叶子节点,询问 \(L-\{x\}\) 会得到 \(n-2\),减去的是 \(x\)\(y=\mathrm{fa_x}\)
  • 那么考虑令 \(V=I-L\),每一次可以拿出 \(V'\subseteq V\),然后询问 \(L-\{x\}+V'\):如果得到 \(n-1\),说明 \(y\in V'\),否则 \(y\not\in V'\)
  • 这样的话,将所有的叶子的父亲找到后,就将所有的叶子丢掉,此时它们的父亲成为了新的叶子,那么继续上面的过程就能将所有点的父亲找到了。
  • 同时注意到因为 \(c_0=c_2+1\),那么 \(|V|\leq \frac{n}{2}\),也就是说二分次数是 \(8n\),加上最开始找叶子需要的 \(n\) 次询问,总共是 \(9n\) 次,可以通过。

Subtask #2

  • 注:如果一个点有 \(k\) 个儿子,则称其为 \(k\) 度点。
  • 此时最开始的一步就出现了问题:询问 \(I-\{x\}\) 时,只要 \(x\) 不是二度点,都会得到 \(n-1\) 。那么不妨先考虑询问 \(I-\{x\}\) 将二度点分开,并且令叶子、一度点的集合为 \(L\)
  • 接着考虑询问 \(L-\{x\}\) 得到的结果:如果是 \(n-2\) 的话,说明 \(x\) 是叶子,并且父亲是二度点,否则无法说明什么。
  • 注意到,如果一个叶子的父亲是一度点,或者一个一度点的父亲是一度点,那么我们没有办法区分它们到底谁在上面谁在上面,这个时候就 GG 了。那么到时候将无解的情况判掉,现在我们要处理的就是这样一种情况:所有的叶子和一度点的父亲都是二度点。
  • 此时仍然考虑询问 \(L-\{x\}\),那么如果得到了 \(n-2\) 说明 \(x\) 是叶子,否则说明 \(x\) 是一度点。先不考虑一度点,建出叶子和二度点构成的树,然后将一度点插进去。
  • 考虑令 \(L_0\) 表示叶子集合,如果对于 \(L_0'\subseteq L_0\) 和一个一度点 \(x\),询问 \(L_0'+\{x\}\):如果得到 \(n+1\),说明加进来的仅有 \(x\)\(x\) 的子树中存在 \(L_0\) 中的点;否则如果 \(x\) 的子树中不存在 \(L_0'\) 中的点的话,得到的结果一定为 \(n+2\),因为同时加进来的还有 \(\mathrm{fa}_x\)
  • 那么考虑边分治,令当前分治中心为 \((u,v),\mathrm{fa}_v=u\),同时令 \(L_{0,v}\) 表示 \(v\) 子树内的叶子集合。对于一度点 \(x\),可以通过询问 \(L_0-L_{0,v}+\{x\}\) 来判断 \(x\) 是否属于 \(v\) 的管辖范围内(因为是找每条边上有没有一度点,所以 \(v\) 的管辖范围其实包含 \((u,v)\)) 。
  • 无解的情况也方便讨论。此时复杂度仍然能使用上面的分析,因为总点数是 \(n\),每个点的代价都是 \(\log n\) 。据说上界是 \(10408\),不太理解为什么出题人将上界出了这么紧 ...
posted @ 2023-02-26 21:35  Qiuly  阅读(155)  评论(0编辑  收藏  举报