제출 #453684

#제출 시각아이디문제언어결과실행 시간메모리
453684arminatarod철인 이종 경기 (APIO18_duathlon)C++17
100 / 100
148 ms32192 KiB
#include <bits/stdc++.h>

using namespace std;

constexpr int MAXN = 200005;

constexpr int COMPONENT = 100002;

constexpr int MAXINT = 1073741823;

vector<long long int> neighbors[MAXN], links[MAXN];

bitset<MAXN> visited;

long long int answer, current_size, current_component;

long long int height[MAXN], minimum_height[MAXN], real_vertices[MAXN];

vector<int> current_vertices;

void dfs(int v, int level) {
	visited[v] = true;
	current_size++;
	height[v] = level;
	minimum_height[v] = height[v];
	current_vertices.push_back(v);
	for (int i : neighbors[v])
		if (visited[i])
			minimum_height[v] = min(minimum_height[v], height[i]);
		else {
			dfs(i, level + 1);
			minimum_height[v] = min(minimum_height[v], minimum_height[i]);
			if (minimum_height[i] >= height[v]) {
				links[v].push_back(COMPONENT + current_component);
				while (links[COMPONENT + current_component].empty() || links[COMPONENT + current_component].back() != i) {
					links[COMPONENT + current_component].push_back(current_vertices.back());
					current_vertices.pop_back();
				}
				current_component++;
			}
		}
	return;
}

void recheck(int v) {
	real_vertices[v] = (v < COMPONENT? 1 : 0);
	for (int i : links[v]) {
		recheck(i);
		real_vertices[v] += real_vertices[i];
		if (v >= COMPONENT)
			answer -= (long long int)links[v].size() * real_vertices[i] * (real_vertices[i] - 1LL);
	}
	if (v >= COMPONENT)
		answer -= (long long int)links[v].size() * (current_size - real_vertices[v]) * (current_size - real_vertices[v] - 1LL);
	return;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n, m, u, v;
	cin >> n >> m;
	for (int i = 0; i < m; i++) {
		cin >> u >> v;
		u--;
		v--;
		neighbors[u].push_back(v);
		neighbors[v].push_back(u);
	}
	for (int i = 0; i < n; i++)
		if (!visited[i]) {
			current_size = 0;
			dfs(i, 0);
			answer += current_size * (current_size - 1LL) * (current_size - 2LL);
			recheck(i);
		}
	cout << answer;
	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...