2024.10.1 近期练习
CF1993F2 Dyn-scripted Robot
这个题非常的一眼,首先翻转路径的操作可以转化为翻转矩形。
也就是,如果触碰了边界不改变行走的路径,而是继续走下去,只不过对应的位置需要对称回去。
那么,计算走到 \((0,0)\) 的次数,也就是在反转后的坐标系里的 \((2k_1w,2k_2h)\) 的位置。
类比 2024 省选“季风”,把路径上每个点在不同周期的位置取出来,是 \((x+t\Delta x,y+t\Delta y)\) 的形式。
然后求解多少个 \(t\),满足 \(x+t\Delta x=0\pmod{2w},y+t\Delta y=0\pmod {2h}\)。
发现这就是 EXCRT 的形式,然后合并出来计算即可。
CF2003F Turtle and Three Sequences
观察到 \(m\) 很小。所以这个题非常像 CSP2022“假期计划”,于是考虑给每种 \(b\) 随机染上 \(m\) 种颜色之一。
那么我们若选出 \(m\) 个不同颜色的位置,\(b\) 一定不同。
所以现在我们相当于使 \(a_i\) 递增,\(c_i\) 和最大,且颜色覆盖 \(m\) 种的每种且不重复。
这个用 dp 很简单处理。考虑像普通 LIS 那么用树状数组优化 dp 求即可。
考虑计算算正确的概率,一次算对是 \(\dfrac{m!}{m^m}=0.0384\),重复大概 \(120\) 次,正确的概率就 \(99.9\%\)。
CF2004G Substring Compression
很明显一个性质,若要把 \(t_i\) 重复 \(t_{i-1}\) 次,那么 \(t_{i-1}\) 一定是属于 \(1\sim 9\)。
所以题目可以转化为划分若干段出来,每一段的权值是其首位数乘上长度减一。这个可以拆贡献。
考虑 dp,有 \(10\) 种状态,对应当前段首位数是多少。转移考虑新开段或继续接上。
转移比较简单,维护 \(f_{i,j}\) 表示前 \(i\) 位上一段是 \(j\) 的答案,以及 \(\min_j f_{i,j}\),用 ddp 处理。
然后这个题是滑动窗口形式的询问,所以套上 Baka's Trick,即双栈模拟队列即可。
CF2006E Iris's Full Binary Tree
我们考虑找一个根出来,这个根需要满足度数 \(\le 2\),其他的节点度数 \(\le 3\)。
关于从这个根出发最远的点深度,这与直径有关,深度也就是其到直径中点的距离+直径的一半。
所以我们只需要维护直径中点的位置即可。注意到每次挂叶子,直径中点移动最多半条边。
直径中点的移动会造成子树加,拍到 dfs 序上处理即可。
于是相当于查找全局 \(\min\),对于度数 \(>2\) 的,我们将其设为 \(\inf\) 即可。
这个十分典,树上点到其他点最长距离与直径中点有关。
CF2001E2 Deterministic Heap
先考虑构造一棵树出来是什么样的,显然 \(a_1=k\),之后的 \(k\) 满足 \(a_{2k}+a_{2k+1}\le a_k\)。
那么这样构造出来的树是一定满足大根堆的性质。
再考虑 pop 操作是确定的条件,这个难以转化。如果只 pop 一次,我们可以简单划分子任务。
pop 根节点,相当于 pop \(a_u\) 更大的那个子树,考虑枚举 \(a_u,a_v\),满足 \(a_u> a_v,a_u+a_v\le a_{rt}\)。
考虑 pop 两次,我们还要记录一维状态表根节点儿子最大权值。
每个子树,那么其子树都可能 pop \(0/1/2\) 次。枚举两次 pop 后上来的是哪里来的。
第一次 pop 是取 \(a_u,a_v\) 更大的那个,钦定是 \(a_u\),其儿子最大的是 \(a_w\)。然后第二次是 \(a_v,a_w\) 更大的。
所以状态数是 \(O(nk^2)\),考虑前缀和优化那么转移线性。