[ARC125D] Unique Subsequence

发布时间 2023-08-15 19:10:42作者: -白简-

\(pre_i\) 表示在 \(i\) 之前最后一个和 \(i\) 相同的数的位置,\(dp_i\) 表示第 \(i\) 个数为结尾的序列的合法方案数。

对于 \(pre_i = 0\),即在 \(i\) 之前不存在与 \(i\) 相同的数,\(dp_i\)\(\left[ 1,i - 1 \right]\) 转移过来。由于这个数还没有在之前出现过,它本身也是一个合法序列,所以要加 \(1\)

\[dp_i= \sum_{j=1}^{i-1}dp_j + 1 \]

对于 \(pre_i \neq 0\),即在 \(i\) 之前存在与 \(i\) 相同的数,那么我们考虑 \(\left[ 1,pre_i - 1 \right]\) 这部分,由于 \(i\) 已经在之前出现过了,这部分序列加上 \(i\) 的部分在 \(pre_i\) 已经处理过了,再加的话会导致重复。

考虑 \(\left[ pre_i,i - 1 \right]\) 这部分,对于之前加过的单独的 \(i\),这时候要 \(-1\),但是又因为产生了新序列 \(\left\{ pre_i,i \right\}\),这里要 \(+1\),所以最终不加不减。

\[dp_i=\sum^{i-1}_{j=pre_i}dp_j \]

最后我们用树状数组对区间求和进行优化。