Atcoder ABC393 题解
ABC393
A
分四类输出即可。
| Takahashi | Aoki | result |
|---|---|---|
| fine | fine | 4 |
| fine | sick | 3 |
| sick | fine | 2 |
| sick | sick | 1 |
B
\(n\) 很小,\(O(n^3)\) 枚举 \(i,j,k\),判断是否满足 \(j-i=k-j\),且 \(a_i=\)A,\(a_j=\)B,\(a_k=\)C。
submission.
当然可以 \(O(n^2)\) 枚举 \(i,j\),算出 \(k\)。
C
把所有不是自环的无向边丢进 set,set 中元素个数就是最终简单图的边数。
\(m\) 减边数就是答案。
submission.
D
\(1\) 与 \(0\) 交换,就是将 \(1\) 平移一位(好理解一点?)。
令 \(1\) 的个数为 \(tot\),所有 \(1\) 的位置是 \(a_1,a_2,\cdots,a_{tot}\)。若最终的区间是 \([l, l+tot-1]\)(左端点为 \(l\)),那么总代价就是 \(\sum_{i=1}^{tot} \left | a_i - (l+i-1) \right| = \sum_{i=1}^{tot} \left | (a_i-i+1) - l \right|\)。\(l\) 取 \(a_i-i+1\) 的中位数即可(经典结论,绝对值可理解为数轴上两点距离,画图,调整法可证)。
E
枚举倍数比枚举因数好做得多。
大体思路是对于枚举 \(a_i\) 的每个因数 \(x\)(GCD 一定是本身的因数),若 \(x\) 是不少于 \(k\) 个数的因数,那么 \(x\) 这个数就是一个可能的答案,所有的 \(x\) 取 max 即可。虽然我们包含了一些错误的答案,不一定是【最大】公因数,但一定会被更大的覆盖掉。
记 \(cnt_i\) 为 \(i\) 在原序列中出现了多少次。
我们枚举值域内所有的数 \(i\),枚举所有 \(i\) 的倍数 \(j\)(\(i\) 就是 \(j\) 的因数),那么 \(i\) 这个数就是 \(cnt_j\) 个数的因数。
我们再次枚举 \(i,j\),如果 \(cnt_i \ge k\),那么就可以用 \(i\) 更新 \(ans_j\)。
输出每个 \(ans_{a_i}\) 即可。
F
我们先用二分求出以 \(a_i\) 结尾的 LIS 长度 \(f_i\)。
具体地,我们建一个辅助数组 \(b\),初始长度为 \(0\),维护其单增性。
从前往后枚举 \(i\),如果 \(a_i\) 大于 \(b\) 的尾元素,就将 \(a_i\) 插入 \(b\) 的末尾,\(f_i\) 就是 \(b\) 的长度;否则,找到第一个 \(b\) 中大于等于 \(a_i\) 的位置 \(p\),连同 \(p\) 这个位置,\(f_i\) 就等于 \(p\),然后将 \(b_p\) 改为 \(a_i\)。
首先 \(b\) 的单增性是不会被破坏的,无论哪种情况。
\(f\) 的更新操作也很好理解,相当于找到了前面一个比当前小的元素转移。
那为什么要修改 b[p]=a[i] 呢?为了后面转移。后面可能有 \(a_i < x \le b_p\) 的元素 \(x\),这时将 \(x\) 接在 \(a_i\) 后面显然不劣。(手玩一下,很好理解)
每个询问的上界只需保证 \(r\) 大于等于末元素即可(因为是 LIS)。
于是就是一个二维数点的板子。
具体地,就是平面上有 \(n\) 个点 \((i,a_i)\),值为 \(f_i\),每个询问要求矩形 \((0,0)-(r,q)\) 中的最大值。
离线一维,用数据结构(树状数组)维护另外一位即可。
G
不会。

浙公网安备 33010602011771号