Submission #982507

#TimeUsernameProblemLanguageResultExecution timeMemory
982507michifiedDuathlon (APIO18_duathlon)C++17
100 / 100
72 ms26964 KiB
#include <bits/stdc++.h>
#define ll long long
using namespace std;

vector<vector<int>> adj, BCCgraph;
vector<int> ord, low, siz;
stack<int> st;
int t = 0, cnt = 0, k, n;
ll ans = 0, ss = 0;

void findBCC(int cur, int par) {
	t++;
	ss++;
	ord[cur] = low[cur] = t;
	st.push(cur);
	for (int v : adj[cur]) {
		if (not ord[v]) {
			findBCC(v, cur);
			low[cur] = min(low[cur], low[v]);
			if (low[v] == ord[cur]) {
				k++;
				int tmp = -1;
				BCCgraph[cur].push_back(k);
				while (tmp != v) {
					tmp = st.top();
					st.pop();
					BCCgraph[k].push_back(tmp);
				}
			}
		}
		low[cur] = min(low[cur], ord[v]);
	}
}

void subtract(int cur) {
	siz[cur] = cur < n;
	for (int v : BCCgraph[cur]) {
		subtract(v);
		siz[cur] += siz[v];
		if (cur >= n) ans -= BCCgraph[cur].size() * siz[v] * (siz[v] - 1);
	}
	if (cur >= n) ans -= BCCgraph[cur].size() * (ss - siz[cur]) * (ss - siz[cur] - 1);
}

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);

	ll m, u, v;
	cin >> n >> m;

	ord.resize(n);
	adj.resize(n);
	low.resize(n);
	BCCgraph.resize(n * 2 + 1);
	siz.resize(n * 2 + 1);
	k = n - 1;
	int i;
	for (i = 0; i < m; i++) {
		cin >> u >> v;
		u--;
		v--;
		adj[u].push_back(v);
		adj[v].push_back(u);
	}
	for (i = 0; i < n; i++) {
		if (not ord[i]) {
			ss = 0;
			findBCC(i, -1);
			ans += ss * (ss - 1) * (ss - 2);
			subtract(i);
		}
	}
	cout << ans;
}
#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...