Submission #546816

#TimeUsernameProblemLanguageResultExecution timeMemory
546816MonarchuwuDuathlon (APIO18_duathlon)C++17
8 / 100
98 ms19072 KiB
#include<iostream> #include<algorithm> #include<vector> using namespace std; typedef long long ll; const int N = 1e5 + 9; int n, m; vector<int> g[N]; // bridge tree (WA for subtask 89) namespace subtask34567 { int num[N], low[N], tme; int lab[N], cnt_scc, sz[N]; int path[N], top; void tarjan(int u, int p) { num[u] = low[u] = ++tme; path[++top] = u; for (int v : g[u]) if (v != p) { if (num[v]) low[u] = min(low[u], num[v]); else { tarjan(v, u); low[u] = min(low[u], low[v]); } } if (num[u] == low[u]) { // chot ++cnt_scc; int v; do { v = path[top--]; lab[v] = cnt_scc; num[v] = low[v] = N; ++sz[cnt_scc]; } while (v != u); } } vector<int> g2[N]; void init_graph() { for (int u = 1; u <= n; ++u) for (int v : g[u]) if (lab[u] != lab[v]) g2[lab[u]].push_back(lab[v]); } ll ans, dp[N][3]; bool vis[N]; void dfs(int u, int p) { vis[u] = true; dp[u][1] = sz[u]; dp[u][2] = (ll)(sz[u] - 1) * (sz[u] - 1); ans += (ll)sz[u] * (sz[u] - 1) * (sz[u] - 2); for (int v : g2[u]) if (v != p) { dfs(v, u); dp[u][1] += dp[v][1]; dp[u][2] += dp[v][2]; dp[u][2] += dp[v][1] * sz[u]; ans += dp[v][1] * (sz[u] - 1 + (ll)(sz[u] - 1) * (sz[u] - 2)) * 2; ans += dp[v][2] * sz[u] * 2; } } void solve() { for (int i = 1; i <= n; ++i) if (!num[i]) tarjan(i, 0); init_graph(); for (int u = 1; u <= cnt_scc; ++u) if (!vis[u]) dfs(u, 0); cout << ans << '\n'; } } bool f[N]; int main() { cin.tie(NULL)->sync_with_stdio(false); cin >> n >> m; for (int i = 0, u, v; i < m; ++i) { cin >> u >> v; g[u].push_back(v); g[v].push_back(u); } subtask34567::solve(); } /** /\_/\ * (= ._.) * / >0 \>1 **/
#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...