【题解】CF2031

A

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

B

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

C

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

D

  • tag:好题

Sol 1 并查集

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

Sol 2 Clever 做法

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

E

  • tag:好题
  • 根据直觉考虑树形 dp
  • fu 表示子树 u 可满足同构所需最小完美二叉树深度
  • 考虑转移:
    • 考虑没有儿子:由于这道题的深度是 0-index,直接返回即可
    • 考虑只有一个儿子:fu=fv+1
    • 考虑有两个儿子:fu=max(fv)+1
    • 考虑有好多好多儿子:显然必须逐个合并,考虑合并顺序
      • 显然先合小的更优,于是每个点开 pq 即可
  • 答案即为 f1
posted @   yeyou26  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示