Codeforces Round #671 (Div. 2)
A. Digit Game
有一个正整数 \(n \leq 10^{1000}\),先手每次可以把奇数位染黑,后手每次可以把偶数位染黑,如果最后一个没被染黑的数是奇数先手赢,否则后手赢,给定 \(n\) 求谁有必胜策略。
题解:
如果总位数是奇数,先手可以控制剩下的数是哪个,否则后手可以控制,两种情况分别判一下奇数位是否有奇数/偶数位是否有偶数即可。
B. Stairs
定义一个 \(n\) 层的楼梯为第一行一个格子,第二行两个,第三行三个 ,\(\cdots\),第 \(n\) 行 \(n\)个格子右对齐组成的图形。
如果一个 \(n\) 层楼梯是好的,当且仅当它可以被分成不超过 \(n\) 个不相交的正方形。
\(T\) 组询问一个 \(m\),求不超过 \(m\) 个格子最多拼出几个大小不同的好的楼梯。
\(T \leq 1000\),\(m \leq 10^{18}\)。
题解:
思路:
看起来非常分治,可以猜到,合法的楼梯大小为 \(2^k-1\)
证明:
考虑楼梯的左上边界,每个格子一定在不同的正方形里,所以每个楼梯至少要 \(n\) 个不相交的正方形才能覆盖,并且每个正方形都要至少覆盖一个左上边界的格子。
发现每个正方形最多覆盖一个左上边界的格子,因为如果同时覆盖两个那么那两个就都不是楼梯的左上边界了。
所以每个正方形恰好覆盖一个左上边界的格子。
最左下的格子一定被划分成一个整的正方形。
一定有一个从左往右第二列,从下往上第二行为左上角的 \(2 \times 2\) 的正方形(如果是 \(1 \times 1\) 的那么从左往右第二列,最下面一行的格子不会被覆盖)。
依此类推,可以发现每个正方形如果是存在的那么位置就是确定的。
假设前 \(x\) 个正方形构成了一个楼梯,那么第 \(x+1\) 个正方形一定是 \((x+1)\times (x+1)\) 的,所以 \(x+1\) 到 \(2x+1\) 之间没有合法的楼梯。
如果可以构造出 \(2^k-1\) 即可得证。
直接放一个 \(2^{k-1}\) 的正方形在右下角,其余递归构造即可。
\(O(T\log m)\)
C. Killjoy
有 \(n\) 个数 \(a_1,a_2 \cdots a_n\),和一个常数 \(k\)。
如果某一时刻 \(a_i=k\) 则 \(a_i\) 被感染。
如果某一时刻 \(a_i=a_j\) 且 \(a_j\) 被感染则 \(a_i\) 也被感染。
你每次可以选择一个集合,重新安排它们的值,但是要求和不变。
问最少几次可以感染所有数。
题解:
答案一定 \(\leq 2\),因为可以随便选两个数,把其中一个变成 \(k\),再把所有数都变相等。
如果所有数都 \(=k\),显然答案 \(=0\),否则显然答案 \(>0\)。
考虑什么时候可以一次感染所有数。
如果一开始没有被感染的数,操作后一定要所有数都 \(=k\) 才能被一次性都被感染。
否则的话只要把所有数变得和感染的数相等即可。
综上所述,如果所有数都 \(=k\),答案 \(=0\),如果所有数的和 \(=k\times n\) 或者存在一个数 \(=k\),答案 \(=1\),否则是 \(2\)。
\(O(\sum n)\)
D1. Sage's Birthday (easy version)
给定 \(n\) 互不相同的数,要把它们重新排序,使得满足 \(i \in [2,n-1]\) 且 \(a_i<a_{i-1}\) 且 \(a_i<a_{i+1}\) 的 \(i\) 最多,给出最大值和构造。
题解:
因为合法的 \(i\) 显然不相邻,且 \(i\) 一共有 \(n-2\) 种可能的取值,所以答案上界为 \(\lfloor \frac{n-1}{2} \rfloor\)。
不妨设 \(a_1<a_2<a_3\cdots a_n\)。
把所有 \(<=a_{\lfloor \frac{n-1}{2} \rfloor}\) 的数放到偶数位,其余放到奇数位,即可达到上界。
\(O(n \log n)\)
D2. Sage's Birthday (hard version)
给定 \(n\) 个数(不保证互不相同),要把它们重新排序,使得满足 \(i \in [2,n-1]\) 且 \(a_i<a_{i-1}\) 且 \(a_i<a_{i+1}\) 的 \(i\) 最多,给出最大值和构造。
题解:
和上一题类似,但是要尽量避免 \(a_i=a_{i+1}\) 的情况。
所以把奇数位和偶数位分别按升序排序。
但是在 \(n\) 是偶数的情况下偶数位的最后一个数会被浪费,判一下能不能把前面一个相等的换成不等的即可。
证明就是如果前面不存在相等的,就已经是最优的了。
否则答案最多亏 \(1\),如果能换这个 \(1\) 就补回来了。
如果所有数都相等换不换也无所谓。
否则一定能把前面一对相等的和它换成不等的。
\(O(n \log n)\)
E. Decryption
给定一个合数 \(n\),你要把它的 \(>1\) 的因子排成一个环。
每次操作可以把环上两个数变成它们的 \(\text{lcm}\),问至少多少次操作可以使得任意相邻两个都不互质。
给出环的构造和答案。
\(T \leq 100\),\(n \leq 10^9\)
题解:
肯定尽量让这个环上面相邻两个数都不互质。
下面 \(p,q\) 都表示某个质数。
如果 \(n\) 有一个质因数(\(n=p^k\)),它的因子有 \(p,p^2,p^3\cdots p^k\),随便排都不互质,答案 \(=0\)。
如果 \(n\) 有两个质因数 (n=\(p^aq^b\))
如果 \(n=pq\),它的因子有 \(p,q,pq\),很遗憾 \(p,q\) 一定相邻,不存在答案 \(=0\) 的构造。
但是把 \(p,q\) 进行一次操作即可,答案 \(=1\),显然不能更小。
否则不妨设 \(a>1\),答案可以 \(=0\)。
构造:\(pq,p,\) 所有剩下的 \(p\) 的倍数 \(,p^2,p^2q\),所有剩下的 \(q\) 的倍数。
如果 \(n\) 有 \(\geq 3\) 个质因数,不妨设它们是 \(p_1,p_2,\cdots,p_k\),答案可以 \(=0\)。
构造: \(p_1p_2\),所有剩下的 \(p_1\) 的倍数,\(p_2p_3\),所有剩下的 \(p_2\)的倍数,\(\cdots\) \(p_kp_1\),所有 \(p_k\) 的倍数。
\(O(\sum \sqrt{n})\) (分解质因数)
F. Rain of Fire
平面上有 \(n\) 个点,只有某两个点的连线平行于坐标轴它们两个才互相能走到。
问能不能加一个整点使得所有点都能走到对方,如果能的话求最大距离的最小值。
\(n \leq 1000\),\(|x|,|y| \leq 10^9\)
题解:
二分答案。
二分后可以看成某对点的连线平行于坐标轴且距离 \(\leq mid\) 才互相能走到,要判断是否连通。
算出每对点能不能走到对方,能的话加一条边。
如果最后只剩一个连通块,显然是可行的。
考虑如何判断两个点是否能加一个点之后可达。
如果 \(\max (|x_1-x_2|,|y_1-y_2|) \leq mid\) 的话,就在 \((x_1,y_2)\) 或者 \((x_2,y_1)\) 加一个点。
如果 \(x_1=x_2\) 且 \(|y_2-y_1| \leq mid\) 或者 \(y_1=y_2\) 且 \(|x_2-x_1| \leq mid\) 的话,就在它们两个中点加一个点。
可以暴力枚举点对,假设加 \((x,y)\) 这个点可以让这两个点对连通,就在 \(map_{(x,y)}|=bel_x|bel_y\),其中 \(map\) 是个 \(map\),\(bel_x\)和\(bel_y\) 是 \(x,y\) 所属连通块。
最后遍历一遍 \(map\) 看有没有全集即可,\(O(n^2\log n \log x)\),勉强能冲过去。
关于卡常:可以先判是否有解再二分,因为无解的情况二分时候是跑满的。
其实好像可以单 \(\log\) (离散化之后差分?)
分类讨论。
如果只有两个连通块,暴力枚举点对判是否可达。
否则加的那个点一定在两个点的连线(且平行于坐标轴)上。
这样的线段一共只有 \(O(n)\) 个。
三个连通块的情况枚举线段和点,看点到线段的距离是否 \(\leq mid\)。
四个连通块的情况枚举两个线段看是否有交。
浙公网安备 33010602011771号