Submission #1175521

#TimeUsernameProblemLanguageResultExecution timeMemory
1175521xnqsPaths (BOI18_paths)C++20
100 / 100
195 ms92720 KiB
#include <iostream> #include <fstream> #include <vector> #include <queue> #include <utility> #include <algorithm> #include <cstring> int gs, edg, cols; std::vector<std::vector<int>> adj_list; int node_color[300005]; int64_t dp[300005][32]; int64_t sol(int node, int mask) { if (__builtin_popcount(mask)==cols) { return 1; } if (dp[node][mask]!=-1) { return dp[node][mask]; } int64_t& ret = (dp[node][mask] = 1); for (const auto& i : adj_list[node]) { if (!(mask&(1<<node_color[i]))) { ret += sol(i, mask|(1<<node_color[i])); } } return ret; } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); std::cout.tie(NULL); std::cin >> gs >> edg >> cols; for (int i = 1; i <= gs; i++) { std::cin >> node_color[i]; --node_color[i]; } adj_list.resize(gs+1); for (int i = 0, a, b; i < edg; i++) { std::cin >> a >> b; adj_list[a].emplace_back(b); adj_list[b].emplace_back(a); } int64_t ret = 0; memset(dp,-1,sizeof(dp)); for (int i = 1; i <= gs; i++) { ret += sol(i, 1<<node_color[i]); } std::cout << ret - gs << "\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...