Submission #242690

#TimeUsernameProblemLanguageResultExecution timeMemory
242690iefnah06Duathlon (APIO18_duathlon)C++98
100 / 100
202 ms27512 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

int n, m;
vector<vector<int> > edges;

vector<int> sidx;
int curidx;
vector<int> sbcc;
vector<vector<int> > bedges;
vector<int> stk;

int dfs(int v, int& nv) {
	sidx[v] = curidx;
	int lowval = curidx;
	curidx++;
	stk.push_back(v);
	nv++;
	for (size_t j = 0; j < edges[v].size(); j++) {
		int w = edges[v][j];
		if (sidx[w] == -1) {
			int wlowval = dfs(w, nv);
			if (wlowval == sidx[v]) {
				bedges.push_back(vector<int>());
				sbcc.push_back(0);
				while (true) {
					int t = stk.back();
					stk.pop_back();
					bedges.back().push_back(t);
					bedges[t].push_back(int(bedges.size())-1);
					sbcc.back() += 1;
					if (t == w) break;
				}
				bedges.back().push_back(v);
				bedges[v].push_back(int(bedges.size())-1);
				sbcc.back() += 1;
			} else {
				lowval = min(lowval, wlowval);
			}
		} else {
			lowval = min(lowval, sidx[w]);
		}
	}
	return lowval;
}

ll total = 0;

int dfs2(int v, int p, int nv) {
	int sz = (v < n);
	int cur = v < n ? -1 : sbcc[v-n];
	for (size_t j = 0; j < bedges[v].size(); j++) {
		int w = bedges[v][j];
		if (w == p) continue;
		int wsz = dfs2(w, v, nv);
		total += ll(wsz) * sz * cur;
		sz += wsz;
	}
	total += ll(nv - sz) * sz * cur;
	return sz;
}

int main() {
	ios::sync_with_stdio(0), cin.tie(0);
	cin >> n >> m;
	edges.resize(n);
	for (int i = 0; i < m; i++) {
		int a, b;
		cin >> a >> b;
		a--; b--;
		edges[a].push_back(b);
		edges[b].push_back(a);
	}
	sidx.assign(n, -1);
	bedges.reserve(2*n);
	stk.reserve(n);
	sbcc.reserve(n);
	bedges.resize(n);
	for (int i = 0; i < n; i++) {
		if (sidx[i] == -1) {
			int nv = 0;
			stk.clear();
			dfs(i, nv);
			int sz = dfs2(i, -1, nv);
			assert(sz == nv);
		}
	}
	total *= 2;
	cout << total << '\n';
}

#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...