AGC020

A

如果 \(2 \mid b - a\) 则 Alice 赢,否则 Borys 赢,时间复杂度 \(\mathcal{O}(1)\)

B

可以倒推,也可以二分,时间复杂度 \(\mathcal{O}(n)\)\(\mathcal{O}(n \log n)\)

C \((\texttt{Easy} \ 2 / 0)\)

设总和为 \(s\)。考虑任意一个子集和其补集,其和一个不大于 \(\frac{s}{2}\)、一个不小于 \(\frac{s}{2}\),显然答案就是能凑出的 \(\ge \frac{s}{2}\) 的第一个数。

D \((\texttt{Medium} \ 3 / 2)\)

首先这个最小值就是 \(k = \frac{\max\{A, B\}}{\min\{A, B\} + 1}\);答案肯定形如 \(\texttt{A...ABA...ABA...AB...BAB...BAB...B}\) 的形式。具体地,答案由两部分组成:第一部分中每两个 \(\texttt{B}\) 之间有 \(k\)\(\texttt{A}\)(除了最后一段);第二部分每两个 \(\texttt{A}\) 之间有 \(k\)\(\texttt{B}\)(除了第一段)。

然后我们需要求出两段的分界点。这个东西直接做非常麻烦,但是我们不需要那些 useless algorithms,直接进行一个 binary search 即可!

时间复杂度 \(\mathcal{O}(q(\log(a + b) + d - c))\)

E \((\texttt{Easy} \ 3 / 0)\)

我们设 \(f(s)\) 为答案,那么我们枚举第一个字符有没有被压缩,可以得到两种转移:

  • \(f(s) \leftarrow f(s[2..n])\)
  • \(f(s) \leftarrow f(t) \times f(s[dk + 1..n])\),其中 \(k > 1, dk \le n\)\(t[i] = \texttt{1}\) 当且仅当对于 \(j = 0, 1, \cdots, k - 1\)\(s[jk + i] = \texttt{1}\)

这个转移的正确性毋庸置疑,问题在于是 \(t\) 有可能不是 \(s\) 的子串。你加了个记搜,感觉它跑得挺快就交了一发,然后过掉了!

那么这个做法为什么能过呢?关键在于 \(t\) 的长度其实缩减地很快。因为 \(k > 1\),所以 \(2 \times |t| \le |s|\) ,如果 \(|t|\) 较大,那么得到 \(t\) 的操作次数比较少,这样的 \(t\) 也不多;如果 \(|t|\) 较小,因为 \(t\)\(\texttt{01}\) 串,所以长度为 \(|t|\) 的串至多有 \(2^{|t|}\) 个。把前三次操作拿出来单独分析可以得到状态数的一个很宽松的上界是 \(10^6\)

F \((\texttt{Medium} \ 6 / 1)\)

为什么我就想不到!!!

因为圆周长度和弧长是整数,所以我们事实上只关心中心点的小数部分的相对大小!于是我们可以 \(\mathcal{O}(n!)\) 地枚举它,并把 \(c\) 个点扩成 \(nc\) 个点,规定小数部分第 \(i \ (i = 0, 1, ..., n - 1)\) 小的只能放在 \(\equiv i \pmod n\) 的位置上,然后钦定一条弧在最左侧,设 \(f_{i, j, s}\) 表示已经考虑前 \(i\) 个点作为起点,当前能覆盖前 \(j\) 个点,已经放了 \(s\) 内的线段有多少种情况,就可以做了。

还有一个问题就是会有线段放在最后面,然后延伸到开头覆盖之前的线段没覆盖到的点。解决方法很简单:钦定最左侧的弧是最长的弧即可。

时间复杂度 \(\mathcal{O}(n^2 c^2 2^n n!)\)

posted @ 2022-09-17 14:41  Scintilla06  阅读(21)  评论(0编辑  收藏  举报