Submission #1296648

#TimeUsernameProblemLanguageResultExecution timeMemory
1296648mikurakillPaths (BOI18_paths)C++20
100 / 100
222 ms92232 KiB
#include<iostream>
#include<vector>
using namespace std;

int N, M, K;
long long dp[300'001][32]; // v, ilość = kod_bin
short kol[300'001];
vector<int>graf[300'001];

vector<pair<int, int>>mapuj[6][5]; // długość_składnika, kolory 1-5
// mapuj[ długość_składnika ][ kolor_v ] = { {x, x}, {x, x}, {x, x}, ... }

void inicjuj_mapowanie(){
    int bity[32];
    for(int i=0; i<32; i++)
        bity[i] = (bool)(i&1) + (bool)(i&2) + (bool)(i&4) + (bool)(i&8) + (bool)(i&16);

    for(int k = 1; k<=K; k++){
        for(int d=1; d<K; d++){
            // sprawdzam jakie bitmaski się nadają
            for(int m=0; m<32; m++){
                int b = 1<<(k-1);
                // cout<<b<<' '<<bity[m]<<'\n';
                if( (b&m)==0 && d == bity[m] ){
                    mapuj[d][k].push_back({m, m|b});
                }
            }
        }
    }
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin>>N>>M>>K;
    for(int i=1; i<=N; i++){
        cin>>kol[i];
        dp[i][1<<(kol[i]-1)] = 1;
    }
    for(int i=1; i<=M; i++){
        int a, b;
        cin>>a>>b;
        graf[a].push_back(b);
        graf[b].push_back(a);
    }
    inicjuj_mapowanie();

    long long suma = 0;
    for(int d=2; d<=K; d++){
        for(int v=1; v<=N; v++){
            long long zyskane = 0;
            for(int i:graf[v]){
                for(auto j:mapuj[d-1][kol[v]]){
                    suma += dp[i][j.first];
                    dp[v][j.second] += dp[i][j.first];
                    //zyskane += dp[i][j.first];
                }
            }
            //cout<<v<<": "<<zyskane<<'\n';
        }
    }
    cout<<suma<<'\n';
}
















    // for(auto i:mapuj[3][2]){
    //     for(int j=0; j<5; j++)
    //         cout<<(bool)(i.first&(1<<j));
    //     cout<<"  ";
    //     for(int j=0; j<5; j++)
    //         cout<<(bool)(i.second&(1<<j));
    //     cout<<'\n';
    // }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...