====== Codeforces Round #639 (Div. 1) (Unrated) ====== ====== [A] Hilbert's Hotel====== ===== 题意 ===== 给一个映射:$k\to k+a_{k\bmod n}, \forall k\in \mathbb{Z}$。 问这个映射是否是 $\mathbb{Z}\to\mathbb{Z}$ 的一一映射。 $1\le n\le 2\cdot 10^5$,$|a_i|\le 10^9$。 多组数据。 ===== 解法 ===== 其实这个就很简单,你考虑把 $0$ 到 $n-1$ 的数加上对应的 $a_i$,然后把它们模 $n$,看看模完的余数是不是恰好 $0$ 到 $n-1$ 都有就行了。 为什么模完之后有数字没有就不是一一映射? 考虑原来有 $n$ 个数,变换(加上模掉)之后如果 $0$ 到 $n-1$ 之间有不存在的,那么变换后数少于 $n$ 个,根据抽屉原理必有两个的余数撞了车。 不妨设这两个原来分别为 $x, y$,这里 $x, y\in [0, n-1]$。 撞车的意思就是说 $x+a_x\equiv y+a_y\pmod{n}$ 也就是说 $\exists k\in \mathbb{Z}, \quad x+a_x+kn=y+a_y$。 那么你可能会说其实 $x+a_x\neq y+a_y$ 是可能的,为什么不是一一映射呢? 要注意我们的定义域是 $\mathbb{Z}$,如果说 $\exists k\in \mathbb{Z}, \quad x+a_x+kn=y+a_y$,那么我令 $z=x+kn$,就有: $y+a_y=(x+kn)+a_x=z+a_{z\bmod n}$ 那么就是存在一个 $z$,他和 $y$ 经过加上 $a_i$ 的变换之后变换到了恰好同一个位置上,那么就不是一一映射了。 可能到这里你以为这个题就做完了(其实第一行就可以做完了),但其实我们没有证明这个判据的充分性。为什么取出 $0$ 到 $n-1$ 执行操作并取模之后,结果依旧是 $n$ 个互异的数时,原映射一定是一一映射呢? 其实这很简单。 我们考虑将 $\mathbb{Z}$ 中的元素按照模 $n$ 的余数划分成 $n$ 个等价类,分别叫做 $\mathbb{Z}_0, \mathbb{Z}_1,\ldots, \mathbb{Z}_{n-1}$。 然后我们考虑在同一个等价类内的元素,比如考虑 $\mathbb{Z}_i$。 这里面的元素有:$\{\ldots, -2n+i, -n+i, i, n+i, 2n+i, \ldots\}$ 根据变换规则我们把它们套进那个映射之后,这些元素会被映射到: $\{\ldots, -2n+i+a_i, -n+i+a_i, i+a_i, n+i+a_i, 2n+i+a_i, \ldots\}$ 可以看出整个类里的元素的偏移量相等,都是 $a_i$。 那么这些元素模 $n$ 的余数依旧全部相等,且等于 $(i+a_i)\bmod n$。 那么如果对所有的 $i\in [0, n-1]$,$(i+a_i)\bmod n$ 互异,就可以保证原映射是一个一一映射。 ====== [B] Monopole Magnets ====== 这个题当时场上想了快一个小时。感觉状态好差啊,不会做结论题,难受。 ===== 题意 ===== 给无限个单极磁铁和一张地图,你每步操作可以选一对异名磁铁,如果它俩在同一行或者同一列,那么 N 向 S 移动一格。如果两者重叠什么都不会发生。 地图上的格子有黑白之分。你的任务就是在地图上放置 N 磁铁和 S 磁铁,构成初始状态,使其满足: * 所有黑色的格子,经过某些恰当操作后,都能有一块 N 磁铁在其中; * 所有白色的格子,无论经过怎样的操作,都不可能有 N 磁铁在其中。 * 每行每列均至少有一个 S 磁铁。 求出你所需要的 N 磁铁的最少数量。 无解输出 -1。 $1\le n, m\le 1000$ ===== 解法 ===== 这个题是个结论题。首先给出结论: 如果同一行或者同一列上有两段连续的黑格子,中间由白格子隔开,那么无解; 如果有全白的行,却无全白的列,或者有全白的列,却无全白的行,那么无解。 否则答案是地图中黑格子的连通分量个数。这里连通是四个方向上的连通。 至于证明,这里先摸了,有时间来补,今晚还有 ddl,我人没了,摸了摸了。 ====== [C] Quantifier Question ====== 这个题啊,非常鬼鬼。最近离散题莫名多?场上写完交了,然后没注意细节,同时 queue 巨长无比,被 pretest 叉爆了,难受啊。 ===== 题意 ===== 给一个不确定的合式公式: $Q_1x_1Q_2x_2\ldots Q_nx_n((x_{j_1}0$ 时单调减) 考虑我们首先把 $b_i$ 都取为 $0$,发现这时候结果是 $0$。 然后考虑贪心的把 $b_i$ 往上涨,涨到 $\sum b_i=K$。 我们每步可以选取使得 $(b_i+1)(a_i-(b_i+1)^2)-b_i(a_i-b_i^2)$ 最大的 $b_i$ 进行 ''%%++b_i%%''。 然后我们发现这时候凸性可以派上用场了。 凸函数在数轴上一段连续的整点处的取值序列,依旧具有凸性。 考虑 $f(i, j)=j(a_i-j^2)$,也就是说 $\{f(i, j)\}$ 对 $j$ 依旧具有凸性。 那么如果我们用 $\Delta f(i, j)$ 表示 $\{f(i, j)\}$ 的一阶差分序列中的元素,会发现 $\{\Delta f(i, j)\}$ 具有单调性。 那么这边就吻合上了,我们贪心的时候需要每步对所有 $i$ 选取最小的 $\Delta f(i, b_i)$,执行 ''%%++b_i%%''。 那么显然我们每步取出的 $\Delta f(i, b_i)$,随着执行过程,也是有单调递减的。 那么到这做法就很显然了,我们直接二分这个值,对每个 $i$ 再次二分这个值的位置,加速贪心过程。 ====== [E] Train Tracks ====== ====== [F] Piet's Palette ====== 还没看,摸了。