【题解】CF2031

A

  • tag:签到题
  • 注意到定住一个值后,左边的值全都得改,右边的值也全都得改
  • 注意到,定住的越多,需要改的就越少
  • 所以开桶记一下哪个值最多就行

B

  • tag:诈骗诈骗签到题
  • 读完题容易产生 naive 结论:当且仅当错位的两个地方相邻可以修复,其余情况全部无法修复
  • 感觉真不了一点,于是找三个数 ABC 来手模一下
  • 发现这个结论好像是真的,交一发
  • 过了,那就真了吧

C

  • tag:究极神迷构造题
  • 注意到如果是偶数直接 11 22 33 44 55 66 就好了
  • 接下来讨论奇数
  • 注意如果是奇数,必然至少存在一个数出现了奇数次
  • 所以必然存在三个点 \(A,B,C\) 使得 \(|AB|^2+|BC|^2=|AC|^2\)
  • 注意到最小的满足 \(a^2+b^2=c^2\) 的正整数三元组是 \((3,4,5)\)
  • 考虑如何构造:
    • 1 10 26 放一个数
    • 23 27 放一个数
    • 24 25 放一个数
    • 其余地方两两一组放即可
  • 显然小于 27 的奇数无解

D

  • tag:好题

Sol 1 并查集

  • 首先注意到正着跳和反着跳是互逆的,所以我们可以看成只有正或只有反,然后连无向边
  • 考虑并查集
  • 显然,对于每个 \(i\) 都需要向它前面的比它高的点连边,时间复杂度 \(O(n^2)\),不可接受
  • 考虑优化
  • 用一个 pq 维护 \(i\) 之前比 \(i\) 还高的点,键是高度,连一个 pop 一个,并查集同时维护最高高度,离开 \(i\) 时将 \(i\)\(i\) 能到达的最高高度压入 pq 即可
  • 显然对于每个 \(i\),最多进出 pq 一次,所以复杂度 \(O(n\log n)\)

Sol 2 Clever 做法

  • 注意到从一个点开始可能先往后再往前,顺序处理比较麻烦。
  • 我们考虑最开始可以较为简单求出答案的点,容易发现 \(a_i\) 最大的点往后的点肯定跳到这个点上。
  • 于是每次求出答案未确定的点中 \(a_i\) 最大的点。如果它能跳到 \(j\)\(j\) 的答案已求出,答案 \(ans_i=ans_j\) (我们是从大往小枚举,先求出的答案肯定大)。 再让它后面所有没求出答案的 \(j\) 答案为 \(ans_i\)
  • 非常优美,时间复杂度 \(O(n)\)

E

  • tag:好题
  • 根据直觉考虑树形 dp
  • \(f_{u}\) 表示子树 \(u\) 可满足同构所需最小完美二叉树深度
  • 考虑转移:
    • 考虑没有儿子:由于这道题的深度是 0-index,直接返回即可
    • 考虑只有一个儿子:\(f_{u}=f_{v}+1\)
    • 考虑有两个儿子:\(f_{u}=\max(f_{v})+1\)
    • 考虑有好多好多儿子:显然必须逐个合并,考虑合并顺序
      • 显然先合小的更优,于是每个点开 pq 即可
  • 答案即为 \(f_{1}\)
posted @ 2024-11-24 08:14  yeyou26  阅读(43)  评论(0)    收藏  举报