清华集训 part1


跳跳棋

假设有 a < b, 那么可以变成 b < b + (b - a) 或 a - (b - a) < a, 也就是 b < 2b - a 或 2a - b < a。

也就是说以 x 为中轴跳动 y 就会让 y 变成 2x - y。

似乎很难, 但是题目说了不能跳过两个棋子, 这就大大限制了能玩出的花样。

那么支持的操作只有:

  1. 中间的棋子跳成两边的
  2. 离中间棋子较近的跳成中间的

发现缩小两边棋子距离的跳法只有一种, 这样, 整个状态空间可以看成一颗树, 这样, 可以通过判断初始状态和目标状态在树上的距离(不连通就是 infty)来寻找答案。

首先跳到根很容易跳,这样就可以判断无解。

然后发现可以在跳的过程中记录步数, 进一步发现可以快速跳指定的步数。

然后就可以做了, 跳到相同深度然后二分 lca 的深度即可。

提交记录

Rmq Problem / mex

查询的时候对于 [1,r] 的值域线段树, 叶节点记录的是每个数最后出现的位置, 挺妙的。

提交记录

模积和

推式子 + 数论分块。

代码年代久远,丑(

提交记录

串珠子

比较经典的方法, 即 G = exp(F) → F = ln(G) 连通的方案数 = 所有方案数 - 不连通的方案数。

不连通的方案数可以通过枚举点 1 所在连通块的大小来实现, 这就又分成了子问题。

代码年代久远(

提交记录

小 Y 和二叉树

——字典序有天然的贪心性质

显然序列中的第一个数是度数 \(\le 2\) 的编号最小的那个点, 设其为 pos。

分类讨论:

  1. pos 的度数是 1, 那么设 pos 唯一连着的点为 els, 那么 els 当 pos 的父亲的话, 第二个点就是 els(case 1), 反之 els 当 pos 的右儿子(case 2), 则第二个点是 els 的左儿子或 els。比对 case 1 和 case 2 的价值, 哪个小取哪个。case 1 的话, 相当于去掉 pos 之后再回到分类讨论;case 2 的话, 就是另一个问题,“根节点确定了,求字典序最小的中序遍历”, 这个很好搞。如果 case 1 和 case 2 价值相等的话, 即不论 case 1 还是 case 2, els 都是第一个点,这样 els 的度数是 2, 那么可以发现不论直接按 case 1 还是直接按 case 2 处理都是等效的。
  2. pos 的度数是 2, 那么设 pos 连着的两个点为 p,q,那么 els 必有右儿子, 比对下 p,q 当右儿子哪个价值大就行了, 这就又分割成两个子问题。不可能发生相等的情况。

将最初的哪个 pos 作为根, 就可以很轻松地实现上述算法。

提交记录

奇数国

又臭又长的题面真是文明发展的毒瘤 =_=|||

首先这个不相冲等价于 gcd = 1, 那么题面可以被概括为:

  1. 单点修改
  2. 询问某个区间的数乘起来的 φ 值。

询问的结果对 19961993 取模。

这个看上去就是 log2 线段树维护质因数分解啊。

然后这个模数是质数, 于是可以光维护区间乘积和质因子有没有出现过, 就是单 log 了。

(把 φ 的公式记错了调了几分钟草

提交记录

posted @ 2021-03-10 22:27  xwmwr  阅读(62)  评论(0编辑  收藏  举报