Codeforces Round #685 (Div.2) Solution Set
A. Subtract or Divide
显然,对于一个偶数,我们可以将其通过一次操作变成 \(2\)。奇数可以通过一次操作变成偶数,再通过一次操作变成 \(2\)。所以偶数的答案是 \(2\),奇数的答案是 \(3\)。注意特判 \(1\) 的答案是 \(0\),\(2\) 的答案是 \(1\),\(3\) 的答案是 \(2\)。
B. Non-Substring Subsequence
因为这道题对时间限制比较松,\(O(n^2mq)\) 的算法也是可以接受的。考虑暴力枚举整个 \(01\) 串禁止转移的点(显然不包括 \(1\) 和 \(n\)),分两部分对询问的 \(01\) 串进行匹配,这样可以保证分割出来的方案不相邻。又考虑到遍历匹配可能出现一边直接匹配了整个字符串,所以我们还需要对询问串进行分割,将一半放在左边匹配,一半放在另一边匹配。这样就能通过了。
C. String Equality
因为操作可以做无限次,所以说整个字符串可以重排。所以字符串的顺序并不重要。通过第二个操作看,实际上重要的是每个字符的个数。
显然,出现了相同的字符,我们直接匹配,相当于减少两个串中这个字符减少出现次数就行了。因为这个相同的字符如果不匹配,就一定会变成更大的字符,永远不能够匹配这个字符了。
于是,如果字符个数相同,匹配;否则将能匹配的匹配了,然后转移给下一个字符。注意到有 \(k\) 的限制,注意下转移时判断一下是否是 \(k\) 的倍数。桶排瞎贪心即可。
D. Circle Gam
这种题第一步就是手模拟。不如尝试一下?
我们发现,设 \(x=\dfrac{d}{k}\),当:
- \(x<\sqrt{1^2+0^2}\) 时,先手必败;
- \(\sqrt{1^2+0^2} \leq x < \sqrt{1^2+1^2}\) 时,先手必胜;
- \(\sqrt{1^2+1^2} \leq x < \sqrt{1^2+2^2}\) 时,先手必败;
- ……
显然这是有规律的。映射到游戏来,会发生什么?
注意到根号内的第二个数(没有平方)是最优情况下先手可以走的步数,第一个数同理是后手可以走的步数。
于是可以猜测,先手一直往上,后手一直往右一定是整个游戏的最优状态。如果先手必胜,当后手往上的时候,先手可以往右调整这个状态,后手仍然是必败态;当先手是必败态的时候,后手可以同样用这个方法去调整状态。
综上完事儿。少用 sqrt()
。
E1. Bitwise Queries (Easy Version)
这是一个没有用到任何性质的题解。
首先给出一个式子:
考虑证明:\(a \operatorname{xor} b\) 部分等于 \(a,b\) 不相同的位减去 \(a,b\) 都是 \(1\) 的位。所以需要两个 \(+a \operatorname{and} b\) 去调整得到 \(a+b\)。
对前面三个查询 \(5\) 次,分别是 \(a_1 \operatorname{xor} a_2,a_1 \operatorname{xor} a_3,a_1 \operatorname{and} a_2,a_1 \operatorname{and} a_3,a_2 \operatorname{and} a_3\)(\(a_2 \operatorname{xor} a_3\) 可以通过前两次查询结果异或得出),这样就能知道 \(a_1+a_2,a_1+a_3,a_2+a_3\)。
联立解方程可以得出 \(a_1,a_2,a_3\)。然后再根据异或的性质,知道一个数,两个数异或的结果,得到另一个数。每次查询一遍即可。查询次数 \(5+n-3=n+2\)。
注意不要把数组开小了。
E2. Bitwise Queries (Hard Version)
请丢掉 E1 的做法。我们发现我们完全没有用 \(n\) 是 \(2\) 的幂次,值域在 \([0,n-1]\) 的消息。
首先注意到数的数量是 \(n\),值域大小也是 \(n\)。所以说这个序列要么有重复元素,要么是一个 \(0 \sim n-1\) 的排列。
首先求 \(1\) 对其他数的 \(\operatorname{xor}\) 值无可避免。于是先求出来。
发现如果整个序列有相同的值,显然有一个数对 \((x,y)\) 满足两个数与 \(a_1\) 异或值相等。随便找一找,如果存在这个数对,我们就能通过一次 \(\operatorname{and}\) 或者 \(\operatorname{or}\) 操作求出 \(a_x,a_y\)。然后反代回去求出整个序列。操作次数 \(n\)。
顺便注意一下有没有一个数满足这个数与 \(a_1\) 异或值为 \(0\)。同样的做法求一发 \(a_1\) 即可。
重要的是这个排列怎么求。实际上也很简单。因为这是一个排列,所以说一定存在两个数 \(x,y\),使得 \(a_1 \operatorname{xor} a_x = n-1,a_1 \operatorname{xor} a_y = 1\)。
考虑这样个玩意儿的意义。首先第二个式子可以发现,\(a_1,a_y\) 一定只相差 \(1\)。进行一个 \(\operatorname{and}\) 操作可以知道 \(a_1\) 除奇偶性的所有前面的信息。
两个式子连起来一看,发现 \(a_x\) 与 \(a_y\) 的奇偶性一定相同。所以我们也能知道 \(a_1\) 的奇偶性。具体就询问 \(a_x \operatorname{and} a_y\),其奇偶性与 \(a_1\) 不同。综上,操作次数 \(n+1\)。
至此,我们解决了这道题。
F. Nullify The Matrix
咕一发。以后更。