Submission #252389

#TimeUsernameProblemLanguageResultExecution timeMemory
252389SaboonDuathlon (APIO18_duathlon)C++14
36 / 100
650 ms1048580 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 3e5 + 20; const int mod = 1e9 + 7; vector<int> g[maxn], t[maxn]; int dw[maxn], h[maxn], rt[maxn], a[maxn], sz[maxn]; bool visited[maxn]; int sz2[maxn]; ll answer = 0; void dfs2(int v, int par = -1){ sz2[v] = a[v]; for (auto u : t[v]){ if (u != par){ dfs2(u, v); sz2[v] += sz2[u]; answer += 1ll * sz2[u] * (sz[rt[v]] - sz2[u] - a[v]); } } if (par != -1) answer += 1ll * (sz2[v] - a[v]) * (sz[rt[v]] - sz2[v]); } int dfs(int v, int root){ rt[v] = root; visited[v] = true; int ret = h[v]; sz[v] = 1; dw[v] = v; a[v] = 1; for (auto u : g[v]){ if (!visited[u]){ h[u] = h[v] + 1; int k = dfs(u, root); sz[v] += sz[u]; if (k <= h[v]){ a[v] = a[u]; dw[v] = dw[u]; } ret = min(ret, k); } else if (h[u] < h[v] - 1){ dw[v] = v; a[v] = h[v] - h[u] + 1; ret = h[u]; } } return ret; } int adj[12][12], dp[2000][12]; int main(){ ios_base::sync_with_stdio(false); int n, m; cin >> n >> m; if (n <= 10){ for (int i = 1; i <= m; i++){ int v, u; cin >> v >> u; v --, u --; adj[v][u] = adj[u][v] = 1; } int answer = 0; for (int s = 0; s < n; s++){ for (int c = 0; c < n; c++){ if (c == s) continue; for (int f = 0; f < n; f++){ if (f == c or f == s) continue; memset(dp, 0, sizeof dp); dp[(1 << s)][s] = 1; bool found = 0; for (int mask = (1<<s)+1; mask < (1 << n); mask++){ for (int i = 0; i < n; i++){ if (!(mask & (1 << i))) continue; for (int j = 0; j < n; j++) dp[mask][i] |= (adj[i][j] & dp[mask^(1<<i)][j]); } if (mask & (1 << s) and mask & (1 << c) and dp[mask][f]) found = 1; } answer += found; } } } cout << answer << endl; return 0; } for (int i = 0; i < m; i++){ int v, u; cin >> v >> u; g[v].push_back(u); g[u].push_back(v); } for (int v = 1; v <= n; v++) if (!visited[v]) dfs(v, v); for (int i = 1; i <= n; i++) for (auto j : g[i]) if (dw[i] != dw[j]) t[dw[i]].push_back(dw[j]); for (int v = 1; v <= n; v++) if (h[v] == 0) dfs2(dw[v]); for (int v = 1; v <= n; v++) if (dw[v] == v and a[v] >= 3) answer -= 1ll*a[v]*(a[v]-1)*(a[v]-2); for (int f = 1; f <= n; f++){ if (a[dw[f]] == 1) continue; int subsz = 1; for (auto u : g[f]){ if (h[u] == h[f]+1 and dw[u] != dw[f]) subsz += sz[u]; if (h[u] == h[f]-1 and dw[u] != dw[f]) subsz += (sz[rt[f]] - sz[f]); } int outsz = sz[rt[f]] - subsz; answer += 2ll * (a[dw[f]]-1) * (outsz-1); } cout << answer << 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...