제출 #1163666

#제출 시각아이디문제언어결과실행 시간메모리
1163666DangKhoizzzzPaths (BOI18_paths)C++20
100 / 100
633 ms107796 KiB
#include <bits/stdc++.h>
#define int long long

using namespace std;

const int maxn = 3e5 + 7;

int n , m , k, a[maxn] , dp[maxn][(1 << 5) + 5];
vector <int> g[maxn];


void solve()
{
    cin >> n >> m >> k;
    for(int i = 1; i <= n; i++) cin >> a[i];
    for(int i = 1; i <= m; i++)
    {
        int u , v;
        cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
    }

    for(int u = 1; u <= n; u++)
    {
        a[u]--;
        dp[u][(1 << (a[u]))] = 1;
    }

    for(int i = 1; i < k; i++)
    {
        for(int u = 1; u <= n; u++)
        {
            for(int v: g[u])
            {
                for(int mask = 1; mask < (1 << k); mask++)
                {
                    if(__builtin_popcountll(mask) == i)
                    {
                        if(((mask >> a[v])&1) == 0)
                        {
                            dp[v][(mask | (1 << a[v]))] += dp[u][mask];
                        }
                    }
                }
            }
        }
    }

    int ans = 0ll;

    for(int i = 1; i <= n; i++)
    {
        for(int mask = 1; mask < (1 << k); mask++)
        {
            ans += dp[i][mask];
        }
    }

    cout << ans - n << '\n';

}

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    //freopen("inp.txt" , "r" , stdin);
    //freopen("out.txt" , "w" , stdout);
    solve();
    return 0;
}


/*
    F: Fenwick tree + mảng hiệu -> update range -> sum
    C: binary search
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...