10.15 模拟赛
2025--炼石计划-- 10 月 12 日 --NOIP 模拟赛 #12【订正】 - 比赛 - 梦熊联盟 (mna.wang)
复盘
T1 又是基环树。没太有思路啊。模拟样例。
好像比想象中的复杂不少。没办法,暴力推式子。
最终推出一个:若 \(u, v\) 在同一棵基环树上,且最终它们能走到同一个点,当且仅当 \(dep(u) - id(par(u)) \equiv dep(v) - id(par(u)) \pmod s\)。好像是对的,直接开写。
8:50 调过了所有样例。
T2。题意好神奇,一眼不会做。按照题意模拟能拿到 \(25\)。先写了。
然后打表找 \(m=3,5\) 的规律,也不难。
T3。感觉好像只能做 \(n \le 10\) 的,再大的数据范围好像不得不高精度然后复杂度爆炸。最后做了一个 \(\mathcal O(n^2 \log^3 a_i)\)。虽然能优化但多拿不了分就不改了。
T4。直接 DP 是 \(\mathcal O(nz_i^2)\) 的,可以轻易优化到 \(\mathcal O(nz_i)\)。很快写完了,调了 1e4514min 过了大样例。
结果挂了 \(-10\) 分,应该是 T2 出题人部分分分数配置错了(或者题面上的分值错了),\(100+60+12+24=196\)。
总结
好的地方:
- 没挂分;
- 推式子能力有点强。
不足:
- T2 正解应该是能想出来的。
题解
A. A
做法 1
补集转化。我们只需要求有多少 \(x, y\) 满足存在一个 \(k\) 使得从 \(x, y\) 分别走 \(k\) 步后到达的点相同即可。
显然这是一颗基环内向森林。如果 \(x, y\) 不在同一棵树内显然不合法。我们只需要考虑每单独一棵树内的点对 \(x, y\)。
我们令 \(dep(u)\) 表示点 \(u\) 的深度,即它距离环上最近点的距离。显然环上点的 \(dep = 0\)。
考虑同一棵树上的点 \(x, y\) 什么时候是合法的。不妨令 \(dep(x) \le dep(y)\)。
显然,如果存在一个点使得 \(x,y\) 可以同时到达,那么任意环上点都可以同时到达。反过来也显然成立。因此我们只需要考虑是否存在一个环上点它们能同时到达即可。
因为 \(x\) 比 \(y\) 更浅,所以 \(x\) 一定比 \(y\) 更早走到环。
显然,当 \(y\) 刚刚到达环时(即 \(y\) 走到它的祖宗时),如果此时 \(x\) 没和它相遇,那么以后也没机会了。
于是 \(x, y\) 合法等价于当 \(y\) 走到它的祖宗时它们能相遇。
显然 \(y\) 到达这个点的时间是 \(dep(y)\)。\(x\) 呢?
设 \(s\) 为环的长度,\(dis\) 为 \(x\) 的祖宗和 \(y\) 的祖宗在环上的距离(或者,从 \(x\) 的祖宗开始,需要走多少步才能走到 \(y\) 的祖宗)。
不妨设 \(x\) 在此之前已经在环上走了 \(k\) 圈。问题变成了,是否存在一个这样的非负整数 \(k\),使得:
显然如果 \(k\) 存在则其是唯一的。即:
如果 \(k\) 是整数就意味着:
好像做不下去了,因为这个式子仍然需要同时考虑 \(x, y\)。
不妨考虑 \(d\) 的计算。若我们给环上的点按照顺序编号 \(id = \{0,1,\dots,s-1\}\)。那么 \(d = (id_{y'}-id_{x'}) \bmod s\)(其中 \(x',y'\) 分别是 \(x, y\) 的祖先)。
那么 \(dep(y)-dep(x)-d = dep(y) - dep(x) - (id_{y'} - id_{x'}) = (dep(y)-id_{y'}) - (dep(x)-id_{x'})\)。令 \(w_i = dep(i) - id_{i'}\),那么原条件变成了:
即:
做这个问题是极易的。用 map
统计每种 \(w_i\) 取模 \(s\) 后的数量,然后做 \(n\) 选 \(2\) 的组合数即可。
做法 2
如果 \(x, y\) 能在某个时刻到达同一个点,那么它们在 \(n\) 时刻也一定能到达同一个点。
于是倍增求出每个点走 \(n\) 步后到达的点。用桶统计最终到达每个点的起点方案数,然后做 \(n\) 选 \(2\) 的组合数即可。
B. B
枚举 \(k \in [1, m]\)。
Alice 将会在第 \(i\) 时刻取走 \(1 \sim i\) 的盒子。Bob 的有点奇怪,是从 \(k\) 开始,每次往后跳 \(k\) 步,取走跳到的位置的盒子,如果到尾了再回到开头继续跳。
如果盒子 \(i\) 能被 Bob 取到,就意味着 Bob 到达这个盒子的时间早于 Alice,即 \(< i\)。
我们考虑一次统计一轮的答案。即,从某个点 \(x\) 开始,持续上面的跳 \(k\) 的步骤,计算第一次回到开头前经过的所有 Bob 能获得的答案。
首先可以二分出第一个 Bob 能获得的(即仍没被 Alice 取的)位置。然后是一个等差数列求和。
考虑我们最多会进行几轮。显然如果 Bob 到达了自己原先到达过的位置,就应该立即停止。
而当一轮结束后,Bob 下一步跳的位置一定在 \([1, k)\) 内。根据鸽巢原理至多 \(k\) 轮后就会重复经过这 \(k - 1\) 个点中的某个点,此时停止即可。
复杂度 \(\mathcal O(m^2)\),如果不算多测。