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\),使得:

\[dep(y) = dep(x) + ks + d \]

显然如果 \(k\) 存在则其是唯一的。即:

\[k = \dfrac{dep(y)-dep(x)-d}s \]

如果 \(k\) 是整数就意味着:

\[s \mid dep(y)-dep(x)-d \]

好像做不下去了,因为这个式子仍然需要同时考虑 \(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'}\),那么原条件变成了:

\[s \mid (w_y - w_x) \]

即:

\[w_x \equiv w_y \pmod s \]

做这个问题是极易的。用 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)\),如果不算多测。

posted @ 2024-10-15 17:02  2huk  阅读(15)  评论(0编辑  收藏  举报