Submission #1309938

#TimeUsernameProblemLanguageResultExecution timeMemory
1309938KindaGoodGamesDuathlon (APIO18_duathlon)C++20
0 / 100
118 ms34752 KiB
#include<bits/stdc++.h> #define int long long using namespace std; int mod = 1e9+7; vector<vector<int>> comps; vector<int> num,low,bcc; int counter = 0; stack<int> S; vector<vector<int>> adj; int original = 0; vector<bool> isArt; void Tarjan(int v, int p){ num[v] = low[v] = counter++; S.push(v); for(auto u : adj[v]){ if(u == p) continue; if(num[u] == -1){ Tarjan(u,v); low[v] = min(low[v], low[u]); if(num[v] <= low[u]){ isArt[v] = num[v] != original || (num[v] == original && num[u] > original); vector<int> c; while(c.empty() || c.back() != u){ bcc[S.top()] = comps.size(); c.push_back(S.top()); S.pop(); } comps.push_back(c); } }else{ low[v] = min(low[v], num[u]); } } } vector<int> sz; vector<vector<int>> dp(4,vector<int>(4)); int total = 0; void DFS(int v, int p, vector<bool>& vis, vector<set<int>>& adj){ vis[v] = true; int s = comps[v].size(); vector<int> subs; int tot = 0; auto get = [&](int k){ int p = 0; for(int i = 0; i < k; i++){ p *= s-i; } return p; }; for(auto u : adj[v]){ if(u == p) continue; DFS(u,v,vis,adj); subs.push_back(sz[u]); sz[v] += sz[u]; tot += sz[u]; for(int k = 1; k <= 3; k++){ for(int i = 0; i <= k; i++){ dp[k][v] += dp[k-i][u]*get(i); dp[k][v] %= mod; } } } int t = subs.size(); for(int i = 0; i < t; i++){ for(int j = i+1; j < t; j++){ for(int a = 0; a <= 3; a++){ for(int b = 0; a+b <= 3; b++){ total += get(3-a-b) * dp[a][i] * dp[b][j]; total %= mod; } } } } } int32_t main(){ int n,m; cin >> n >> m; low = num = bcc =vector<int>(n,-1); adj.resize(n); isArt.resize(n); for(int i = 0; i < m; i++){ int a,b; cin >> a >> b; a--;b--; adj[a].push_back(b); adj[b].push_back(a); } for(int i = 0; i < n; i++){ if(num[i] == -1){ original = i; Tarjan(i,i); } } int b = comps.size(); vector<set<int>> tree(b); for(int i = 0; i < n; i++){ if(isArt[i]){ tree.push_back({}); comps.push_back({i}); bcc[i] = b++; } } for(int i = 0; i < n; i++){ if(isArt[i]){ for(auto u : adj[i]){ if(bcc[u] == bcc[i]) continue; tree[bcc[i]].insert(bcc[u]); tree[bcc[u]].insert(bcc[i]); } } } sz.resize(b); vector<bool> vis(b); for(int i = 0; i < b; i++){ if(!vis[i]){ DFS(i,i,vis,tree); } } cout << total << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...