CF1738

A

直接贪心即可。

B

可以求出 \(a_{n - k + 2} \sim a_n\),剩下的贪心判断即可。

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

设计数的个数为 \(x\)、偶数的个数为 \(y\)。按照 \(x \bmod 4\) 分类讨论:

  • \(x \equiv 0 \pmod 4\)\(x \equiv 3 \pmod 4\),则 Alice 必胜;
  • \(x \equiv 1 \pmod 4\),则 Alice 必胜当且仅当偶数的个数为奇数;
  • \(x \equiv 2 \pmod 4\),则 Bob 必胜。

D \((\texttt{Easy} \ 2 / 2)\)

首先找到一个 \(k\),满足:

  • \(b_1 \sim b_k\) 中没有 \(n + 1\)\(b_{k + 1} \sim b_n\) 中没有 \(0\)
  • \(\min_{i \le k} b_i > k\)
  • \(\max_{i > k} b_i \le k\)

然后我们可以找到最左边的一些数,然后直接构造即可。具体地,对于一个已经放置好的数 \(x\),假设 \(b_y = x\)\(y\)\(y_1, y_2, \cdots, y_m\),那么它们要放在 \(x\) 之后的 \(m\) 个位置上。发现至多有一个 \(y_i\) 满足存在 \(b_z = y_i\)\(z\),把它放在最后,然后把 \(y_i\) 作为新的 \(x\) 即可。

E \((\texttt{Easy} \ 2 / 1)\)

考场看错题了,md。

首先把题意转化为选出 \(a_1 < a_2 < \cdots < a_k < b_k < \cdots < b_1\),使得 \(a_i\) 位置的前缀和和 \(b_i\) 位置的后缀和相等。

把每个前缀和和后缀和相等的区间 \((l, r, L, R)\) 找出来,如果 \(R \le l\) 则不可选;发现至多有一组满足 \(r \ge l\),使用一些组合数求和的技巧计算即可。

F \((\texttt{Easy} \ 3 / 1)\)

一个连通块满足条件等价于其平均 \(\deg\) 不大于其点数,不妨强化一下,变为 \(\max \deg\) 不大于其点数。

按照 \(\deg\) 从大到小的顺序考虑每个点,若不满足条件则一直询问,如果连到了之前的连通块则必然合法。

时间复杂度 \(\mathcal{O}(n)\)

G \((\texttt{Easy} \ 4 / 2)\)

因为最长反链等于最小链覆盖,我们的问题等价于用 \(k - 1\) 条从 \((1, n)\) 走到 \((n, 1)\),只能向左 / 向下走的路径覆盖所有的 0,同时最大化这些路径的并。

首先不难发现可以通过一些调整使得两条路径不存在互相穿过的情况,即至多有交点。我们先求出 \(len_{i, j}\) 表示前 \(i\)\(j\) 列所有 0 组成的最长反链长度,我们钦定编号越小的路径越靠左上并倒序放置路径,那么第 \(i \ (i = k - 1, k - 2, \cdots, 1)\) 条路径放完之后必须要把 \(len_{i, j} \ge i\) 区域中的 0 都覆盖了。贪心是容易的,具体地,假设第 \(i\) 条路径当前在 \((x, y)\),那么它接下来向左走当且仅当其左侧的位置的 \(len\)\(\ge i\),或者其下的位置已经被覆盖了。

最后看一下并的大小是否不小于 \(n^2 - (n - k + 1)^2\),然后把多的去掉即可。

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

H

做法一 \((\texttt{Medium} \ 5 / 4)\)

区间本质不同回文串个数,但是 \(n \le 10^6\)

考虑和区间本质不同子串个数类似的做法,区别是一个前缀不是所有的后缀都是回文后缀,所以修改的点不连续。

有一个结论是一个串的回文后缀可以被划分为 \(\mathcal{O}(\log n)\) 个等差数列,考虑长度等差的后缀 \(a, b, c \ (|a| < |b| < |c|)\),那么 \(b\) 上一次出现的位置肯定是 \(c\) 的开头;\(a\) 上一次出现的位置肯定是 \(b\) 的开头。所以对于一个等差数列,它实际上是向右平移了公差的长度,增量就是两次单点修改。

在建 PAM 的过程中,我们求一下 \(dif_u = len_u - len_{fail_u}\) 并比较 \(dif_u\)\(dif_{fail_u}\),就能找出所有的长度为等差序列的链了。

于是用树状数组或线段树维护单点加和区间和即可,时间复杂度不清楚,但是不会超过 \(\mathcal{O}(n \log^2 n)\)

我卡不过。

做法二 \((\texttt{Medium} \ 5 / 2)\)

复读 zky。

\(l\) 为当前的左端点。考虑前缀的 PAM,因为回文串的回文后缀肯定也是其 \(\rm border\),所以一次操作可能新加入的串只有一个:从当前的 \(lst\) 一直跳 \(fail\),跳到长度 \(\le n - l + 1\) 的第一个点。我们考虑维护每个串 \(u\) 的最晚出现时间 \(cov_u\),但是每次需要更新一个点到根的所有结点。注意到如果这个点没有被删除,它的祖先肯定不会被删除,所以我们考虑先给这个点打上标记,在删除它的时候再把它的 \(cov\) 往父亲节点推。我们更新 \(cov_u = t\) 的时候在 \(t - len_u + 1\) 位置插入一个删除 \(u\) 的操作。因为删除一个点的时候它肯定没有儿子在区间内,所以它的 \(cov\) 肯定是准确的,我们再记录每个点还在区间内的儿子个数,在删除的时候判断一下即可。

时间复杂度 \(\mathcal{O}(n)\)

posted @ 2022-10-04 22:01  Scintilla06  阅读(32)  评论(0编辑  收藏  举报