AGC036
A \((\texttt{Easy} \ 1 / 0)\)
令 \(r = \left \lceil \sqrt S \right \rceil, t = r^2 - S\),取三点为 \((0, 0), (r, 1), (t, r)\) 即可。
B \((\texttt{Easy} \ 1 / 0)\)
发现存在长度为 \(\mathcal{O}(n)\) 的循环节。
如果当前有剩,并且接下来还要放一个 \(A\) 在后面,那当前剩下的肯定都不会留下,所以我们只需要关心第一个数什么时候被删掉,即原序列里该数第一次出现的位置,然后再维护一下从每一个后缀开始操作的第一个未被删除的位置即可。
时间复杂度 \(\mathcal{O}(n)\)。
C \((\texttt{Easy} \ 2 / 0)\)
初三时写的。
等价于让我们求满足以下条件的序列 \(a\) 的个数:
- \(\sum a_i = 3m\)
- \(\max\{a_i\} \leq 2m\)
- \(\sum a_i \mod 2 \leq m\)(奇数不超过 \(m\) 个)
如果没有条件 \(2\),那么我们可以枚举奇数个数。奇数个数为 \(k\) 时如果 \(3m - k\) 是偶数,设其为 \(2p\),那么考虑将奇数全部减 \(1\),剩下的 \(n\) 个非负偶数的和就是 \(2p\),又都是偶数显然等价于 \(n\) 个非负整数的和为 \(p\),所以合法的方案有 \(\dbinom{n}{i} \times \dbinom{p + n - 1}{n - 1}\) 个;否则为 \(0\)。
现在考虑如何去掉多余的,即有一个 \(a_i\) 超过 \(2m\) 的。发现这种数如果有,那么只有一个,可以钦定其为 \(a_1\)。那么将 \(a_1\) 减去 \(2m + 1\),又变成了 \(n\) 个非负整数和为 \(m - 1\),这时条件三就不用考虑了,所以共有 \(n \times \dbinom{m + n - 2}{n - 1}\) 种情况。
最后输出二者之差即可。
D \((\texttt{Easy} \ 3 / 2)\)
之前在模拟赛遇到过类似的题目,比这个题更厉害一些。
考虑差分约束,没有负环等价于能够找出 \(n\) 个整数满足如下条件:
- \(x_{i + 1} \le x_i + 0\);
- 若保留边 \(i \to j \ (i < j)\),则 \(x_j \le x_i - 1\);
- 若保留边 \(i \to j \ (i > j)\),则 \(x_j \le x_i + 1\)。
考虑差分,设 \(d_i = x_i - x_{i + 1}\),则条件被转化为
- \(d_i \ge 0\);
- 若保留边 \(i \to j \ (i < j)\),则 \(\sum_{k = i} ^ {j - 1} d_k \ge 1\);
- 若保留边 \(i \to j \ (i > j)\),则 \(\sum_{k = j} ^ {i - 1} d_k \le 1\)。
发现我们可以钦定 \(d_i \in \{0, 1\}\)。枚举删去哪些边过于麻烦,不如枚举 \(d\),然后删去必须要删去的边。上述两类边需要被删去,分别当且仅当 \(d\) 的一个区间和为 \(0\) 以及 \(d\) 的一个区间和 \(> 1\),后者等价于能在区间内找到 \(2\) 个 \(1\),可以由此设 \(f_{i, x, y}\) 表示前 \(i\) 个 \(d\) 中上两个为 \(1\) 的位置为 \(x, y\) 的最小值,转移方程显然,不再赘述。使用前缀和优化即可做到 \(\mathcal{O}(n^3)\) 的时间复杂度通过本题。
E \((\texttt{Medium} \ 4 / 3)\)
首先把所有极大相同字符连续段缩起来,使得剩下的串中没有相邻且相同的字符。设 \(c_A, c_B, c_C\) 表示 A
、B
、C
的个数,不妨设 \(c_A \le c_B \le c_C\),则每两个 A
之间必然是 BC
交替的。
发现若 \(c_B = c_C\),我们肯定能一直合法地删去 BC
或 CB
,直到 \(c_A = c_B = c_C\)。当 \(c_B < c_C\) 的时候,我们必须要去掉一些 C
使得 \(c_B = c_C\) 再进行构造。可以去掉的 C
就是每两个 A
中间的段开头末尾的 C
,比如可以把 ACBCBCA
变为 ABCBA
,删去了两个 C
。如果把这些 C
都删完之后依然不能满足 \(c_B = c_C\),我们就需要考虑减少 A
的数量,即每次删去 AC
或 CA
,直到 \(c_B = c_C\)。不难证明这样做的最优性。
于是按照上述过程做即可,时间复杂度 \(\mathcal{O}(n)\),有一些细节。
F \((\texttt{Medium} \ 6 / 1)\)
想不到!!!!!
每个位置能够取的数在一个区间 \([L_i, R_i]\) 内。如果只有 \(R_i\) 的限制,那就很好做了,把 \(R\) 排序之后答案就是 \(\prod (R_i - i + 1)\)(下标从 \(0\) 开始)。
注意到后 \(n\) 个位置的 \(L_i\) 都为 \(0\),不妨对前 \(n\) 个位置进行容斥,若能对于 \(k = 0, 1, \cdots, n\) 计算出钦定 \(k\) 个 \(p_i < L_i\) 的方案数就能求出答案了。
考虑 dp。因为只有 \(R_i\) 的限制时计算答案需要把 \(R_i\) 排序,而容斥时前 \(n\) 个位置的限制是 \(L_i - 1\),后 \(n\) 个位置的限制是 \(R_i\),我们就按此排序。注意这里若出现限制相同的情况,需要把编号较大的放在前面,因为可能出现 \(L_i = L_{i - 1}, R_i > R_{i - 1}\) 的情况。我们称排序后的顺序 \(o\) 为标准序。设 \(f_{i, j}\) 表示考虑标准序的前 \(i\) 个位置,其中 \(j\) 个 \(< n\) 的位置已经钦定 \(< L_i\) 的方案数。再设 \(cl_i, cr_i\) 表示标准序的前 \(i\) 位有多少 \(< n\) 及 \(\ge n\),则转移如下:
-
若 \(o_{i + 1} \ge n\),则考虑 \(R_{o_{i + 1}}\) 排序后的位置,前面出现的 \(o_j \ge n \ (j \le i)\) 的限制在其之前;前面钦定 \(< L_i\) 的限制也在其之前,所以转移方程即 \(f_{i + 1, j} \leftarrow f_{i, j} \cdot (R_{o_{i + 1}} - cr - j + 1)\)
-
若 \(o_{i + 1} < n\),则分类讨论:
-
若 \(o_{i + 1}\) 被钦定了,同样地考虑 \(L_{o_{i + 1}} - 1\) 排序后的位置,在它之前的数还是有 \(cr + j\) 个,所以转移方程即 \(f_{i + 1, j + 1} \leftarrow f_{i, j} \cdot (L_{o_{i + 1}} - cr - j)\)
-
若 \(o_{i + 1}\) 未被钦定,反过来考虑限制排序后在它后面的会有多少,那就是标准序在其后面的没有被钦定的数的数量。假设我们当前要求钦定 \(k\) 个的答案,那后面还有 \(n - 1 - cl\) 个 \(< n\) 的位置,未被钦定的有 \(n - 1 - cl - k + j\),所以限制在它之前的就有 \(2n - 1 - (n - 1 - cl - k + j) = n + cl + k - j\) 个,转移方程即 \(f_{i + 1, j} \leftarrow f_{i, j} \cdot (R_{o_{i + 1}} - n - cl - k + j + 1)\)。
-
我们在转移的过程中需要固定最终钦定的位置数量,所以要对每个 \(k\) 都做一遍,时间复杂度 \(\mathcal{O}(n^3)\)。