Submission #985123

#TimeUsernameProblemLanguageResultExecution timeMemory
985123TsaganaDuathlon (APIO18_duathlon)C++14
100 / 100
96 ms29780 KiB
#include<bits/stdc++.h>

#define IOS ios_base::sync_with_stdio(false);cin.tie();cout.tie();
#define all(x) x.begin(), x.end()
#define int long long
#define pi pair<int, int >
#define pq priority_queue
#define lb lower_bound
#define ub upper_bound
#define pb push_back
#define eb emplace_back
#define mset multiset
#define F first
#define S second

using namespace std;

vector<vector<int>> adj, bcg;
vector<int> ord, low, siz;
stack <int> st;
int t = 0, cnt = 0, k, u, v;
int ans = 0, ss = 0, n, m;
 
void findBCC(int cur, int par) {
	t++; ss++; ord[cur] = low[cur] = t;
	st.push(cur);
	for (int v : adj[cur]) {
		if (!ord[v]) {
			findBCC(v, cur);
			low[cur] = min(low[cur], low[v]);
			if (low[v] == ord[cur]) {
				int tmp = -1; k++; bcg[cur].pb(k);
				while (tmp != v) {tmp = st.top(); st.pop(); bcg[k].pb(tmp);}
			}
		}
		low[cur] = min(low[cur], ord[v]);
	}
}

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

void solve () {
	cin >> n >> m;
 
	ord.resize(n);
	adj.resize(n);
	low.resize(n);
	bcg.resize(n * 2 + 1);
	siz.resize(n * 2 + 1);
	k = n - 1;

	for (int i = 0; i < m; i++) {
		cin >> u >> v; u--; v--;
		adj[u].pb(v); adj[v].pb(u);
	}
	for (int i = 0; i < n; i++) {
		if (!ord[i]) {
			ss = 0; findBCC(i, -1);
			ans += ss * (ss - 1) * (ss - 2);
			subtract(i);
		}
	}
	cout << ans;
}
signed main(){IOS solve(); 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...