Atcoder ABC398 题解
ABC398
最快的一集。但是 BC 合吃五发罚时。
A
若 \(n\) 为奇数,那么前 \(\frac{n-1}{2}\) 和后 \(\frac{n-1}{2}\) 都是 -,第 \(\frac{n+1}{2}\) 个是 =;
若 \(n\) 为偶数,那么前 \(\frac{n}{2}\) 和后 \(\frac{n}{2}\) 都是 -,第 \(\frac{n}{2}+1\) 个是 =。
B
直接枚举两种牌 \(i,j\),看看出现次数是不是一个不少于 \(2\),一个不少于 \(3\) 即可。
C
记录下每种数的出现次数,然后枚举每个下标,找到出现一次的值中最大的下标即可。值域 \(10^9\),开 map 记录。
D
每个时刻都会加入一团烟,我们若维护每团烟的真实位置要用线段树,查找要用二分,很烦。
但是这个 NSWE 操作是全局的,我们可以弄两个全局 tag,即 dx 和 dy,分别记录行的平移量和列的平移量。
每次平移,就将 tag 做对应操作。加入 \((0, 0)\) 时,我们希望代码中塞进去的点,行列分别加上 \((dx, dy)\) 后是 \((0, 0)\),于是应该加进 \((-dx, -dy)\)。
每次询问,就是要找我们有没有存下一个点 \((x, y)\),满足 \(x+dx=r,y+dy=c\)。即查找 \((x-dx, y-dy)\)。
用 set 维护(不必 multi)。时间复杂度 \(O(n \log n)\)。
E
没有奇环,就是要时刻保持二分图。
我们先对原树进行一个染色(树一定是二分图),找出左部点和右部点。显然左(右)部内部肯定两两不能连边。只能一个左部点,一个右部点之间连边。
只需要枚举左部点 \(u\),枚举右部点 \(v\),将原树中没有的边 \((u, v)\) 加进备选集合,我和 Takahashi 就只能在这个集合中选。
剩下就是,若集合中有奇数个元素,那么我先选;否则,我后选。
每次挑一个没选过 \((u, v)\) 的输出即可。
F
记 \(n\) 为串长,显然最终回文串的长度不会超过 \(2n-1\)。比如,最劣的时候 \(ABCDE \to ABCDEDCBA\)。
套路地,处理回文,正着一遍 hash,反着一遍 hash。记正着 hash 区间 \([l, r]\) 为 \(a(l, r)\),反着为 \(b(l, r)\)。
我们令变量 \(len = 2n-1\),并从 \(n\) 到 \(2n-2\) 枚举可能的长度 \(i\)。
- 若 \(i\) 为奇数:那么原串关于 \(mid = \frac{n+1}{2}\) 对称。具体地,记 \(x=n-mid\),那么 \([mid-x, mid-1]\) 和 \([mid+1, mid+x]\) 对称,即 \(a(mid-x, mid-1)=b(mid+1, mid+x)\)。(可手玩理解,比较简单)
- 若 \(i\) 为偶数:那么原串关于 \(\frac{n}{2} + 0.5\) 对称。具体地,记 \(mid=\frac{n}{2},x=n-mid\),那么 \(a(mid-x+1, mid) = b(mid+1, mid+x)\)。
有个细节,这样写不会出现求一个非法区间 \([l, r]\) 的 hash,即 \(l \le 0\) 或 \(r > n\) 或 \(l > r\)。
输出方案随便写就行。时间复杂度 \(O(n)\)。
G
口胡一个思路,应该是对的吧。
类似 E 题,我们处理出每个连通块对应的二分图。连通块内部补充完整的方案显然唯一,不妨把它们补充完整。记每个连通块的左部点有 \(s_i\) 个,右部点有 \(t_i\) 个。那么补完整会加 \(c=(\sum s_it_i) - m\) 条边。对二取模不影响答案。
然后我们把所有连通块分成三类:
- 左部点偶数个,右部点偶数个,记为 00 型。
- 左部点偶数个,右部点奇数个(或反过来),记为 01 型。
- 左部点奇数个,右部点奇数个,记为 11 型。
在连通块之间连边,实际上是合并连通块的过程。
如,将 \(s\) 的一个左部点连向 \(t\) 的一个右部点,就相当于获得一个新的连通块,左部点个数为 \(s,t\) 之和,右部点同理。
以下展示合并过程。
| 集合 1 | 集合 2 | 合并结果 | 产生贡献(奇 1 偶 0) |
|---|---|---|---|
| 00 | 00 | 00 | 0 |
| 00 | 01 | 01 | 0 |
| 00 | 11 | 11 | 0 |
| 11 | 11 | 00 | 0 |
| 11 | 01 | 01 | 1 |
| 01 | 01 | 00 | 0 |
| 01 | 01 | 11(第二种情况) | 1 |
发现 00 不会对合并结果造成任何影响。
然后我们做一个二维 DP:设 \(f_{i, j}\) 为 \(i\) 个 11 型,\(j\) 个 01 型,先手最终的胜负结果。显然 \(f_{0, 0}=c \ {\text {mod}} \ 2\)。
根据上面,\(f_{i, j}\) 可以从 \(f_{i-2, j},f_{i-1, j},f_{i+1, j-2},f_{i, j-2}\) 转移。
然后套路地,01 DP 可以用 bitset 优化。时间复杂度 \(O(\frac{n^2}{\omega})\)。

浙公网安备 33010602011771号