ARC104A Plus Minus
小学数学。 aclink(0)。
ARC104B DNA Sequence
枚举区间然后开个桶统计一下即可。aclink(0)。
ARC104C Fair Elevator
先确保 (a_i < b_i) 且所有给出的数没有重复。
令 (s_i) 表示 (i) 上的桥距。具体地,(s_{a_i} = b_i - a_i),(s_{b_i} = a_i - b_i)。
(a_i, b_i) 合法当且仅当 (s_i) 合法,(s_i) 合法当且仅当它可以拆分成若干长度为 (2k) 的区间,由前半段 (k) 个 (+k) 和后半段 (k) 个 (-k) 个组成。
考虑到数据范围很小,设 (f_i) 表示 ([0, i)) 是否可以合法。然后转移的时候根据上面的规则判断区间是否可以合法即可。
ARC104D Multiset Mean
对于所有 (1le ile N),求有多少 (1, 2, ..., N) 最多用 (K) 次组成的可重集平均数为 (i)。
枚举 (i),相当于问有多少 (1 - i, 2 - i, ..., N - i) 最多用 (K) 次组成的可重集和为 (0)。
然后这个东西可以用次数可以为负的生成函数搞成 (N) 个 (2) 项式除以 (N) 个 (2) 项式的形式,并且 (i) 和 (i + 1) 只差一项分子一项分母。暴力乘除即可。
时间复杂度 (Theta(N ^ 4)),空间复杂度 (Theta(N ^ 3))。
ARC104E Random LIS
考虑到 (N) 很小,相对大小的种数不会很多,可以暴搜枚举所有 (N) 个数的相对大小。
然后用组合数学求出这种相对大小的出现次数乘以用 dp 求出最长上升子序列长度即可。
ARC104F Visibility Sequence
这种码量的题我搞了一整个下午,觉得我可以退役的可以在评论区里 D 我。
这种统计容易重复的东西最好想办法在最优值上统计它(下文的至少为 (x))。
如果把所有 ((i, P_i)) 的边都连出来,那么会形成一棵 (n) 个点的森林。
如果 (h_j = h_i) 因为当 (i > j),(i) 不会向 (j) 连边,所以可以当作 (h_i > h_j)。
所以可以认为所有值不一样,这样森林就会有个最高点,分成两个小森林。
考虑区间 dp,设 (f[l][r][x]) 表示 ([l, r)) 的区间最大值为 (x) 且最大值至少为 (x) 的森林数。
(f[l][r][x]) 可以由 (f[l][mid][a]) 和 (f[mid + 1][r][b]) 转移当且仅当 (X[mid] ge x) 并且 (a = x) 或者 (b + 1 = x)。实现的时候需要维护 (f) 数组 (x) 这维的前缀和 (s)。
时间复杂度 (Theta(n ^ 4)),空间复杂度 (Theta(n ^ 3))。