计数加练
难度 \([1, 10]\),\(\le 5\) 为秒杀,\(6\) 思考 \(\le \texttt{30min}\),\(7\) 勉强做出来(1h)。\(8\) 是做不出来但是可能认为不是很难的题目。 \(9\) 是基本上现在水平想不出来的题目但是可以为题解做法给出自然推导的,\(10\) 是看懂题解都很困难的题目。
思考时间: 应当 在 \([40, 80] \texttt{min}\) 左右,不应该 \(\le \texttt{30min}\)。
代码实现:肯定都要写一遍,但是不一定是现在。
目前见到的思想:
-
"我们到底需要数什么东西,不需要数什么东西“: 限制组合对象,方便刻画计数对象。
-
寻找相同贡献的子结构
-
找到类似的子结构并划分
ARC147D Sets Scores
-
Tag: 组合 + 性质
-
Difficulty: 7-
糖完了,我怎么对着这个题想了 40min。
首先将 \((S_1, S_2, ..., S_n)\) 对应到 \((S_1, a_2, a_2 ... a_n)\),其中对于 \(a_i\) 表示的是 \(S_{i - 1}\) 如果存在 \(a_i\) 则 \(S_i\) 不存在,否则 \(S_i\) 存在 \(a_i\)。考虑如果固定 \(S_1\) 然后求这样是不好做的,反正会转化成一个 \(O(n^2)\) dp,不知道为啥一直在对着这个想。
考虑固定 \(a_2, ..., a_n\) 的时候怎么做,那么考虑某个元素 \(x\) 是否在 \(S_1\) 中,那么可以求出 \(x\) 在 \(S_i\) 中的贡献 \(u_i\),以及不在时的贡献 \(v_i\)。然后注意到加入 \(S_1\) 中相当于取反,所以有 \(u_i + v_i = n\)。那么对于每个 \(a_2, a_3 ..., a_n\) 的贡献都是 \(n^m\),然后 \(a_2, a_3 ..., a_n\) 的方案数为 \(m^{n - 1}\),乘起来即可。
ARC156D Xor Sum 5
-
Tag: 性质 + dp 计数
-
Diffculty: 8
核心: 考虑 xor 的抵消性质,构造一些可以抵消的东西来限制计数对象,从而方便计数。
若得到的序列 \(X\) 不是回文序列,则 reverse 后可以得到一个相同和的不同序列,从而抵消贡献。因此我们只需要数回文序列的贡献。考虑继续构造子结构,将回文序列劈成两半,那么两半的和一定相同,那么这样的贡献是好算的。具体的:
-
\(k\) 是奇数:不妨枚举中间的数是什么,设为 \(X_{mid}\),则相当于对于两边的异或和有一个加上某个数的贡献,那么设 \(f(k, x)\) 是考虑 \(X_{1, 2, ... k}\) 的 \(x + \sum_{i = 1}^k X_i\) 的异或和。那么有 \(f(k, x) = \oplus_{i = 1}^n f(\lfloor \frac{k}{2} \rfloor, \lfloor \frac{a_i + x}{2} \rfloor) + ((n \bmod 2) \times ((a_i + x) \bmod 2))\)。
-
\(k\) 是偶数:折半即可。
不难发现第一维是 \(\log k\) 级别的,然后中间枚举 \(n\) 次,第二维由于有一个 \(\frac{1}{2}\) 所以由归纳法不会 \(> \max\{a\}\)。时间复杂度 \(O(nV \log k)\)。这里注意代码不能使用 map,否则 TLE。最大的点 \(< 100ms\)。
ARC187C 1 Loop Bubble Sort
-
Tag: 性质 + dp 计数。
-
Diffculty: 6
首先可以发现冒泡排序的本质就是在每次将前缀最大值向后移位直到遇到某一个更大的数,也就是可以将前缀最大值划分为若干个区间,每个区间都形如 \(a_{l + 1}, a_{l + 2}.... a_r, a_l\) 并且 \(a_l = \max_{i = 1}^r a_i, a_{r + 1} > a_i\)。(令 \(a_{n + 1} = n + 1\))。
然后对着这个东西 dp,每次对某个前缀划分会对子问题产生对值域上界的限制,所以设 \(f_{i, j}\) 是考虑 \([1, i]\) 并且 \(\forall 1 \le k \le i, P_i \le k\) 的时的方案数。然后考虑 \(Q_i\) 是否等于 \(-1\),\(pre_i = \max_{j = 1}^i [Q_j \neq -1] Q_j\)。
-
\(Q_i \ne -1\):则考虑 \(Q_i\) 是否为前缀最大值,\(Q_i\) 可能成为前缀最大值的条件为 \(Q_i \ge \max(i, pre_{i - 1})\)。则此时对于 \(j \ge Q_i\) 都有 \(f_{i - 1, Q_i - 1} \to f_{i, j}\)。若 \(Q_i\) 不为前缀最大值,则 \(\forall j \ge Q_i, f_{i - 1, j} \to f_{i, j}\)。
-
\(Q_i = -1\):枚举 \(Q_i\) 的真实值,然后使用前缀和优化一下转移就好了。
时间复杂度 \(O(n^2)\)。