2020 CCPC Wannafly Winter Camp Day5 E Matching Problem(枚举)

在这里插入图片描述

题意:

称序列 KaTeX parse error: Expected group after '_' at position 2: x_̲ 和序列 y y 匹配,当且仅当 p = q p=q 且对 i , j [ 1 , p ] ,   x i = x j y i = y j \forall i,j\in\left[1,p\right],\ x_i=x_j\Leftrightarrow y_i=y_j 给定长度为 n n 的序列 a a 和长度为 4 4 的序列 b b .
序列 a a 的第 i i 项为 a i a_i 序列 b b 的第 i i 求序列 a a 的所有子序列(可不连续)中与序列 b b 匹配的序列数目。
从后往前枚举合法的 a 3 a_3 同时对 x [ 1 , n ] \forall x\in\left[1,n\right] 维护到目前为止 x x 的出现次数。

然后枚举合法的 a 1 , a 2 a_1,a_2 分类讨论可快速求合法的 a 4 a_4 的数量,即对答案的贡献。

AC代码:

const int N = 3e2 + 5;
int n, a[N], b[4];
bool vis[4][4];
int cnt[N];
ll ans;

int main()
{
    sd(n);
    rep(i, 1, n)
        sd(a[i]);
    rep(i, 0, 3)
    {
        sd(b[i]);
        rep(j, 0, i - 1)
            vis[j][i] = b[j] == b[i];
    }
    for (int a2 = n - 1; a2 > 2; a2--)
    {
        cnt[a[a2 + 1]]++;
        rep(a0, 1, a2 - 2)
        {
            if (vis[0][2] ^ (a[a0] == a[a2]))
                continue;
                rep(a1,a0+1,a2-1)
            {
                if (vis[1][2] ^ (a[a1] == a[a2]))
                    continue;
                if (vis[0][1] ^ (a[a0] == a[a1]))
                    continue;
                if (vis[0][3])
                    ans += cnt[a[a0]];
                else if (vis[1][3])
                    ans += cnt[a[a1]];
                else if (vis[2][3])
                    ans += cnt[a[a2]];
                else
                {
                    ans += n - a2 - cnt[a[a0]];
                    ans -= vis[0][1] ? 0 : cnt[a[a1]];
                    ans -= (vis[0][2] || vis[1][2]) ? 0 : cnt[a[a2]];
                }
            }
        }
    }
    pld(ans);
    return 0;
}

发布了704 篇原创文章 · 获赞 420 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/qq_43627087/article/details/104519974