Submission #933270

#TimeUsernameProblemLanguageResultExecution timeMemory
933270LucaIliePaths (BOI18_paths)C++17
100 / 100
728 ms25684 KiB
#include <bits/stdc++.h>

using namespace std;

const int MAX_N = 3e5;
const int MAX_K = 5;
int color[MAX_N + 1];
int vis[MAX_K + 1];
long long dp[MAX_N + 1];
vector<int> perm;
vector<vector<int>> perms;
vector<int> adj[MAX_N + 1], verticesByColor[MAX_K + 1];

void genAranj( int i, int n, int k ) {
    if ( i == k ) {
        perms.push_back( perm );
        return;
    }

    for ( int x = 1; x <= n; x++ ) {
        if ( vis[x] )
            continue;

        perm.push_back( x );
        vis[x] = true;
        genAranj( i + 1, n, k );
        vis[x] = false;
        perm.pop_back();
    }
}

int main() {
    int n, m, k;

    cin >> n >> m >> k;
    for ( int v = 1; v <= n; v++ ) {
        cin >> color[v];
        verticesByColor[color[v]].push_back( v );
    }
    for ( int i = 0; i < m; i++ ) {
        int u, v;
        cin >> u >> v;
        adj[u].push_back( v );
        adj[v].push_back( u );
    }

    for ( int i = 2; i <= k; i++ )
        genAranj( 0, k, i );

    long long ans = 0;
    for ( vector<int> perm: perms ) {
        for ( int v = 1; v <= n; v++ )
            dp[v] = (color[v] == perm[0] ? 1 : 0);

        for ( int i = 1; i < perm.size(); i++ ) {
            for ( int u: verticesByColor[perm[i]] ) {
                for ( int v: adj[u] ) {
                    if ( color[v] == perm[i - 1])
                        dp[u] += dp[v];
                }
            }
        }

        for ( int v = 1; v <= n; v++ )
            ans = ans + (color[v] == perm[perm.size() - 1] ? dp[v] : 0);
    }

    cout << ans << "\n";

    return 0;
}

Compilation message (stderr)

paths.cpp: In function 'int main()':
paths.cpp:55:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   55 |         for ( int i = 1; i < perm.size(); i++ ) {
      |                          ~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...