AT_agc031_b [AGC031B] Reversi 题解

设 $f_i$ 表示 $[1,i]$ 的石头能形成多少种序列,$p_i$ 表示当前 $i$ 的最后一次出现,

若不合并 $i$ 到 $p_{a_i}$,能形成 $f_{i-1}$ 种序列,若合并 $i$ 到 $p_{a_i}$,能形成 $f_{p_{a_i}}$ 种序列,

所以

$$ f_i= \begin{cases} f_{p_{a_i}}+f_{i-1}&p_{a_i}\ne0,p_{a_i}\ne i-1\\ f_{i-1}&\text{otherwise} \end{cases} $$

#include <cstdio>
#define int long long
int n, p[5000050], f[5000050];
signed main()
{
    scanf("%lld", &n);
    for (int i = f[0] = 1, x; i <= n; ++i)
    {
        scanf("%lld", &x);
        f[i] = f[i - 1];
        if (p[x] && p[x] != i - 1)
            f[i] = (f[i] + f[p[x]]) % 1000000007;
        p[x] = i;
    }
    printf("%lld", f[n]);
    return 0;
}
posted @ 2023-08-22 09:51  5k_sync_closer  阅读(2)  评论(0编辑  收藏  举报  来源