제출 #252408

#제출 시각아이디문제언어결과실행 시간메모리
252408Saboon철인 이종 경기 (APIO18_duathlon)C++14
82 / 100
539 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 * a[v] * sz2[u] * (sz[rt[v]] - sz2[u] - a[v]); } } if (par != -1) answer += 1ll * a[v] * (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 e1[maxn], e2[maxn]; int par[55]; int get_par(int v){ return par[v] < 0 ? v : par[v] = get_par(par[v]); } void merge(int v, int u){ if ((v = get_par(v)) == (u = get_par(u))) return; par[v] = u; } bool ok[55][55][55]; int main(){ ios_base::sync_with_stdio(false); int n, m; cin >> n >> m; if (n <= 50){ for (int i = 1; i <= m; i++) cin >> e1[i] >> e2[i]; for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) for (int k = 1; k <= n; k++) if (i != j and i != k and j != k) ok[i][j][k] = 1; for (int x = 1; x <= n; x++){ memset(par, -1, sizeof par); for (int i = 1; i <= m; i++) if (e1[i] != x and e2[i] != x) merge(e1[i], e2[i]); for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) for (int k = 1; k <= n; k++) if (i != x and k != x and j != x and get_par(i) != get_par(j) and get_par(j) != get_par(k)) ok[i][j][k] = 0; for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) if (i != x and j != x and get_par(i) != get_par(j)) ok[x][i][j] = ok[i][j][x] = 0; } int answer = 0; for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) for (int k = 1; k <= n; k++) if (i != j and j != k and k != i and ok[i][j][k]) answer += ok[i][j][k]; 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 c = 1; c <= n; c++){ if (a[dw[c]] == 1) continue; int tot = 0; for (auto u : g[c]){ if (h[u] == h[c]+1 and dw[u] != dw[c]){ answer -= 2ll * (a[dw[c]]-1) * sz[u] * tot; tot += sz[u]; } if (h[u] == h[c]-1 and dw[u] != dw[c]){ answer -= 2ll * (a[dw[c]]-1) * (sz[rt[c]] - sz[c]) * tot; tot += (sz[rt[c]] - sz[c]); } } } 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...