Submission #757268

#TimeUsernameProblemLanguageResultExecution timeMemory
757268shjgkwoDuathlon (APIO18_duathlon)C++17
31 / 100
304 ms48872 KiB
#include <algorithm> #include <iostream> #include <map> #include <set> #include <stack> #include <vector> using namespace std; const int MAXN = 100010; vector<int> edge[MAXN]; map<int, int> bcce[MAXN]; int bcc_cnt = 0; int pre_cnt = 0; int pre[MAXN]; int low[MAXN]; int mypar[MAXN]; int is_sep[MAXN]; long long sum_perm_cnt = 0; long long node_cnt[MAXN]; long long p[MAXN]; set<int> bcc_node[MAXN]; stack<pair<int, int> > st; long long ans = 0; inline const long long nP3(long long n) { return n * (n - 1) * (n - 2); } inline const long long nP2(long long n) { return n * (n - 1); } void dfs(int u, int par) { int child = 0, flag = 0; mypar[u] = par; node_cnt[u] = 1; low[u] = pre[u] = ++pre_cnt; for(auto &v: edge[u]) { if(v == par) continue; if(!pre[v]) { child++; st.push({u, v}); dfs(v, u); node_cnt[u] += node_cnt[v]; low[u] = min(low[u], low[v]); if(pre[u] <= low[v]) { bcc_cnt++; flag = 1; while(st.size() && (st.top().first != u || st.top().second != v)) { int x = st.top().first; int y = st.top().second; bcc_node[bcc_cnt].insert(x); bcc_node[bcc_cnt].insert(y); bcce[x][y] = bcc_cnt; bcce[y][x] = bcc_cnt; st.pop(); } int x = st.top().first; int y = st.top().second; bcc_node[bcc_cnt].insert(x); bcc_node[bcc_cnt].insert(y); bcce[x][y] = bcc_cnt; bcce[y][x] = bcc_cnt; st.pop(); ans += nP3(bcc_node[bcc_cnt].size()); p[bcc_cnt] = nP2(bcc_node[bcc_cnt].size() - 1); } } else if(pre[u] > pre[v]) { st.push({u, v}); low[u] = min(low[u], pre[v]); } } if(child >= 2 && par == 0) is_sep[u] = 1; else if(flag && par != 0) is_sep[u] = 1; } int chk[MAXN]; int cached[MAXN]; long long cache_sum[MAXN]; void solve(int origin, int u, int par) { long long sum_node_cnt = node_cnt[origin] - node_cnt[u]; chk[u] = 1; long long sep = is_sep[u]; for (auto &v: edge[u]) { if(chk[v]) continue; solve(origin, v, u); ans += sep * sum_node_cnt * node_cnt[v] * 2; sum_node_cnt += node_cnt[v]; } if(!sep) { int mybcc = bcce[par][u]; if(cached[mybcc]) { ans += cache_sum[mybcc]; return; } long long sum_tmp_node_cnt = 0; for(auto &tu: bcc_node[mybcc]) { if(bcce[mypar[tu]][tu] != mybcc) { long long tmp = node_cnt[origin] - node_cnt[tu]; cache_sum[mybcc] += sum_tmp_node_cnt * tmp * 2; sum_tmp_node_cnt += tmp; continue; } for (auto &v: edge[tu]) { if(v == mypar[tu]) continue; int anotherbcc = bcce[tu][v]; if (anotherbcc == mybcc) continue; long long tmp = node_cnt[v]; cache_sum[mybcc] += sum_tmp_node_cnt * tmp * 2; sum_tmp_node_cnt += tmp; } } cached[mybcc] = 1; ans += cache_sum[mybcc]; return; } ans += (node_cnt[origin] - node_cnt[u]) * p[bcce[par][u]] * 2; for(auto &v: edge[u]) { if(mypar[v] != u) continue; int bcc = bcce[u][v]; ans += (node_cnt[origin] - node_cnt[v] - 1) * p[bcc] * 2; } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int n, m; cin >> n >> m; for(int i = 0; i < m; i++) { int x, y; cin >> x >> y; edge[x].push_back(y); edge[y].push_back(x); } for (int i = 1; i <= n; i++) { if (pre[i]) { continue; } dfs(i, 0); } for (int i = 1; i <= n; i++) { if (chk[i]) { continue; } solve(i, i, 0); } cout << ans << "\n"; return 0; }
#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...