Submission #1347203

#TimeUsernameProblemLanguageResultExecution timeMemory
1347203NewtonabcPaths (BOI18_paths)C++20
100 / 100
126 ms11972 KiB
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=3e5+10;
int c[N],k;
vector<int> f[N],l[N];
vector<pair<int,int>> li[10][10];
ll ans=0,dp[N];
void rec(vector<int> &vt,int ck){
    int sz=vt.size();
    if(!vt.empty()){
        ll cal=0;
        if(vt.size()==1) for(auto u:f[vt.back()]) dp[u]=1;
        else for(auto u:f[vt.back()]) dp[u]=0;
        if(vt.size()>1){
            int pre=*(vt.end()-2);
            for(auto [u,v]:li[pre][vt.back()]) dp[v]+=dp[u];
        }
        if(vt.size()!=1) for(auto u:f[vt.back()]) cal+=dp[u];
        ans+=cal;
    }
    for(int i=0;i<k;i++){
        if(ck&(1<<i)) continue;
        vt.push_back(i);
        rec(vt,ck|(1<<i));
        vt.pop_back();
    }
}
int main(){
    int n,m; cin>>n >>m >>k;
    for(int i=1;i<=n;i++){
        cin>>c[i];
        c[i]--;
        f[c[i]].push_back(i);
    }
    for(int i=0;i<m;i++){
        int u,v; cin>>u >>v;
        li[c[u]][c[v]].push_back({u,v});
        li[c[v]][c[u]].push_back({v,u});
    }
    vector<int> v;
    rec(v,0);
    cout<<ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...