训练总结 3

cf2090c

对于 \(t_i = 0\) 的人来说,选择空桌子是按照对角线斜向填充的,因为每次要选距离最小且 x 最小的空桌子。所以 y 方向上至少有一个人的桌子数量是 \(\sqrt{n}\) 级别的。

那么维护两个 set :一个维护空桌子,一个维护有人的桌子。预处理把可能的桌子的坐标和距离插到 set 里。查询时每次找符合条件的元素删除就行了。

cf1761e

分类讨论:

  • 图已经连通:0 次。

  • 图不连通:

    • 如果有一个连通块大小为 1,那么直接对这个点操作就行了。

    • 对于一个非完全的连通块,随便找一个点进行操作就行了,因为该点操作完和原本的连通块还是连通,同时与其他连通块联通了。

    • 如果所有连通块都是完全的,那么至少需要两次操作。因为可以先选择一个连通块的一个点操作,这样这个点就和剩下的所有连通块连通了。然后再选一个连通块的一个点操作,这样这个点就和包括第一个连通块的其他连通块都连通了,同时当前这个连通块剩下的点已经和第一个连通块连通了,所以整个图就连通了。但是当只有两个连通块的时候不能这么做,只能从其中一个连通块上一个一个把点拆下来连到另一个连通块上,这样的最小操作次数就是两个连通块大小的 min。

总结一下:dfs 求连通块数量,同时找是否有大小为 1 的连通块,是否有不是完全图的连通块。然后根据上面的分类就行了。

但是写完发现 wa 了,为什么呢?因为在讨论中忽略了一个重要的点:对一个连通块选择点操作的时候,有可能把原本的连通块变得 不连通 了!!!!

所以选点的时候不能选 割点。更进一步,我们只需要选择一个度数最小的点就行了,因为如果这个度数最小的点是割点,度数为 \(d\),那么与其相连的所有点的度数至少为 \(d\),也就是说这个图是一个完全图,没有割点,矛盾了。

gym103438

G

注意到 \(w_{ij}\) 是对称的,也就是说与 \(a_i\)\(b_i\) 的顺序是无关的。更进一步的说,令 \(a_i < b_i\),那么 \(w_{ij} = \max\{b_i - a_j, b_j - a_i\}\)。假设 \(b_i - a_j < b_j - a_i\),移项有 \(a_i + b_i < a_j + b_j\)。所以按照 \(a_i + b_i\) 从大到小排序,然后取前 \(n\) 个的 \(b_i\) 减去 后 n 个的 \(a_i\) 就是答案。

J

假设 A,B,C 的数量为 c1,c2,c3。那么当 c1 + c2 < c3 或 c1 + c3 < c2 或 c2 + c3 < c1 时是无解的,因为没有足够多的对应字母进行匹配。更进一步,我们可以得到 AB,BC,AC的匹配次数 \(\frac{c_1 + c_2 - c_3}{2}\)\(\frac{c_2 + c_3 - c_1}{2}\)\(\frac{c_1 + c_3 - c_2}{2}\)

然后,AB,AC,BC 的匹配本质上是括号匹配,A 是左括号,C 是右括号,B 既可以是左括号也可以是右括号。那么不妨从 B 入手。

为了尽可能满足匹配数量,让前 \(BC = \frac{c_2 + c_3 - c_1}{2}\) 个 B 用来匹配 BC,剩下的后 \(\frac{c_1 + c_2 - c_3}{2}\) 个 B 用来匹配 AB,这样能尽量的匹配更多的 BC 和 AB。

剩下没有匹配的 A 和 C 就两两匹配。当匹配过程中找不到右括号或左括号的时候无解,达不到对应匹配次数时无解。

cf1665d

有意思的交互提。

首先有 \(\gcd(x + a, x + b) = \gcd(x + a, |b - a|)\)。询问次数是 \(\log{x}\) 级别的,提示我们从二进制的角度思考问题。

那么如何从二进制角度逐步确定 x 呢?首先从低位往高位猜,消除高位对低位的影响,假设现在猜到了第 \(i\) 位,已经知道了前 \(i - 1\) 位的答案为 \(x'\),那么构造出 \(a = 2^{i - 1} - x\)\(b = 2^{i - 1} + 2^{i} - x\),这样相当于询问了 \(\gcd(x, 2^{i})\),如果第 \(i\) 为 1,那么询问结果是 \(2^{i}\)。否则第 \(i\) 位为 0。

gym104008e

三角形的面积可以通过叉积表示,现在已知 \(\overrightarrow{AB} = (u, v)\),设 \(\overrightarrow{AC} = (p, q)\),那么面积 \(2S = |uq - pv|\)

由裴蜀定理可知,对于方程 \(ax + by = n\),有正整数解的充要条件是 \(\gcd(a, b) \mid n\)。所以面积取到最小的时候,p,q 应该满足方程 \(uq - pv = \gcd(u, v)\)。用 exgcd 解出一个解就能得到 C 的坐标了。

CSP 认证 T4

简要题意:给定长度为 \(n\) 的数组 \(a\),定义一个区间 \([l, r]\) 的价值为 \(l \times r \times \gcd(a_l, a_{l+1}, \cdots, a_r)\)。求所有区间的价值之和。\(n \leq 10^6\)\(a_i \leq 10^6\)

不保证以下文字的正确性。

首先固定 \(l\),考虑怎么算以其为左端点的价值之和。一个重要的点是 gcd 的变化次数不会太多,是 log 级别的,每次至少要少掉一个质数。关键是怎么快速找出这些点并统计答案。

我们考虑两个相邻的区间 \([l, r]\)\([r + 1, r']\),其中 \(r\) 是使得 \([l, r]\) 中 gcd 变化的点,\(r'\) 是使得 \([r + 1, r']\) gcd变化的点。那么整个区间 \([l, r']\) 的 gcd 为 \(\gcd(g_1, g_2)\)。这意味着只有当 \([r, r']\) 区间的 gcd 变化为 不是 \(g_1\) 的倍数 或 小于 \(g_1\) 的时候,整个区间的 gcd 才会发生变化。也就是说,我们只需要维护以每个点为起点往右走,走到哪里会使 gcd 变化,变化为多少。这样在统计答案的时候暴力的跳这些点,就能统计到所有答案,这样的点数是 log 级别的。这里用到了类似于传递性的性质。

所以用 ST 表预处理区间 gcd,对于每个点预处理下一个 gcd 改变的点和 gcd 的值,枚举左端点,然后暴力跳右端点统计答案就行了。这样就是单个 log 的。

posted @ 2025-03-31 20:54  Nylch  阅读(28)  评论(0)    收藏  举报