link
https://codeforces.com/gym/690768
CuteCube Garden - Testing Round 1 题解
A. Common Tangents
初中几何结论
首先两个圆有无穷多条切线当且仅当两圆完全重合,即 。
记两圆圆心距 ,有下面的结论:
- ,内含,条公切线。
- ,内切,条公切线。
- ,相交,条公切线。
- ,外切,条公切线。
- ,外离,条公切线。
但是 的计算有浮点运算,怎么办?
别开根号,把 和 平方了再比较。
B. Max-flow on a Grid
观察 +bfs
首先注意到,答案肯定不会大于 。
哪怕是一个障碍都没有的网格,也能这么放:
1 | .#... |
所以,答案只有 , 或者 。现在的问题是, 很好判断,到不了右下角就行。 待会再说, 怎么判断。
目前我自己能想到的比较可行的做法应该只有下面这种:
如果一个网格被截断,说明对于障碍物来说,存在一条从左边或者下边 八连通 到右边或者上边的通路。
举几个例子:
1 | ..... |
这就是左边或者下边八连通到右边或者上边,答案是 。
1 | ..... |
这种显然答案是 ,怎么找到具体的格子呢?
从左边和下面所有格子开始第一次八向 bfs,标记所有遇到的障碍为 。
从右边和上面所有格子开始第二次八向 bfs,标记所有遇到的障碍为 。
然后枚举每个空格子,看它周围八格 和 是不是齐的。
1 | ..... |
有了这个方法,一开始也不用对空格 bfs 看能不能走到右下角,在第一次做八连通 bfs 时就可以看障碍有没有直接到右边或者上边。
如果枚举空格后没有周围 和 齐的点,那么答案就是 。此时只要往 和 一放完事。(答案为 时,这两个点肯定是空的。)
C. Dig Two Treasures
按位确定
次就是 次 。
首先,既然只有刚好一次才能获取信息,我们想的是,应该去找那种两个 不会在一起的下标。什么信息两个 会不一样呢?两个 下标是不一样的,所以至少有一位不一样。
第一步:我们枚举每个位置,把所有第 位是 (或者 ,随意)、第 位是 、……、第 位是 的下标全部拉出来问,如果回答是 ,说明这两个下标这位是一样的;否则就不一样。
肯定有一位不一样,但是不要 break,先全部问完。
第二步:举个例子说明:比如第 位两者不同,然后那么所有第 位为 的下标一定有且只有一个 。我们在 这堆下标 里继续问,把第 位是 的下标、第 位是 、……、第 位是 的下标再拉出来问一下(第 位无所谓是否再问一遍)。
如果回答是 ,由于最多一个 ,说明这个 下标的这一位是 ,否则这一位就是 。
这样我们相当于把一个 按位确定了,但是另外一个怎么办?此时第一次问完的作用体现了:我们知道了每一位这两个下标相同还是不同。
D. Flipping Chess
博弈 dp+ 状压
首先这么复杂的规则排除贪心。
那么考虑状压,用每一位表示这个棋子是否还存活。
对于博弈的过程,我们本身不需要考虑这么多,由于数据小,直接枚举选的棋子,按照规则然后看去掉相对应的棋子是否是对于对手来说的必败态。
那这里就要注意了,这里平局补偿规则导致了双方是不对称的,所以我们必须 dp 的时候再套一层维度:用 表示当前操作的玩家(或者理解为先后手)。
时间复杂度:
E. Average Depth of a Random Tree
推一下式子:
先定义添加的第 个节点的期望深度为 。前面所有的节点期望深度总和为 ,平均为 。
这个结论异常简洁,每加一个点,新树的深度增加量是 ,其中 是新树的节点数。
然后 ,意思就是说第一个新节点的增加量是原树的节点数 +1 分之一。
一路递推下去,记 是原树平均深度:
记 :
最终式子就是这么简单,预处理 。
至于 Easy version,把暴力一路 dp 的做法放过去了。
F. CuteCube’s Challenge 1:Data Structure
时间戳线性基 + 高斯消元正交化
假设看这题的都会常规的线性基。
线性基有个加强的用法:时间戳线性基,在每次加入元素之后,记录加入的顺序,调整每个基直到它是最新的元素。
然后要再知道怎么高斯消元(或者叫正交化),高斯消元后按位贪心一路下来,用了哪几个基就是第几小。
有没有 0 的话,看是不是线性相关,看情况答案 +1。
反正会的人自然会,出题人不想自己介绍了
复杂度: ,其中 是线性基的大小。
Dashboard - CuteCube Garden - Round 2 (Div. 3) - Codeforces
A
C
把行列奇偶分开看,4 组,每组最多是国际象棋黑白染,。
H
一个 的内向基环树森林,多次查询一个点向后延伸若干步的不同的点权数量。
倍长后断环为链,那么这个内向基环树森林就退化为一个森林。
在树上处理是容易的。
- 将所有查询离线存储,挂载在较深的节点 上。
- 使用一个数组 pos[c] 记录颜色 目前在链上最深所在的深度。
- 使用 BIT 维护每个深度上是否包含某个颜色的最深出现。如果是,该深度的值为 ,否则为 。
- 遍历挂在节点 上的所有查询 。此时树状数组中 [dep[v]-k, dep[v]] 区间和,就是这段路径上不同颜色的数量。
- 回溯的时候删掉。
