제출 #158214

#제출 시각아이디문제언어결과실행 시간메모리
158214maruii철인 이종 경기 (APIO18_duathlon)C++14
66 / 100
145 ms23752 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
#define ff first
#define ss second

int N, M, dfn[100005], dfnn, low[100005], cpn[100005], cpnn, sz[100005], T[100005];
vector<int> edge[100005];
vector<pii> bdge[100005];
ll ans;

void dfs(int x, int p) {
	dfn[x] = low[x] = ++dfnn;
	N++;
	for (auto i : edge[x]) {
		if (i == p) continue;
		if (dfn[i]) {
			if (dfn[i] < dfn[x]) low[x] = min(low[x], dfn[i]);
			continue;
		}
		dfs(i, x);
		low[x] = min(low[x], low[i]);
	}
}

void bcc(int x, int c) {
	cpn[x] = c;
	sz[c]++;
	for (auto i : edge[x]) {
		if (cpn[i]) continue;
		if (low[i] == dfn[i]) {
			bdge[++cpnn].emplace_back(c, i);
			bdge[c].emplace_back(cpnn, x);
			bcc(i, cpnn);
		}
		else bcc(i, c);
	}
}

void calc(int x, int p) {
	ll n = sz[x], t = (N - n) * (N - n);
	ans += n * (n - 1) * (n - 2) + 2 * (n - 1) * (n - 1) * (N - n);
	int v;
	for (auto i : bdge[x]) {
		if (i.ff == p) {
			v = i.ss;
			continue;
		}
		calc(i.ff, x);
		ans -= 2 * (n - 1) * sz[i.ff] * T[i.ss];
		T[i.ss] += sz[i.ff];
		sz[x] += sz[i.ff];
		t -= 1ll * sz[i.ff] * sz[i.ff];
	}
	if (p) ans -= 2 * (n - 1) * (N - sz[x]) * T[v];
	ans += n * (t - 1ll * (N - sz[x]) * (N - sz[x]));
}

int main() {
	ios_base::sync_with_stdio(0), cin.tie(0);
	int n; 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 (dfn[i]) continue;
		N = 0;
		dfs(i, 0);
		bcc(i, ++cpnn);
		calc(cpnn, 0);
	}
	cout << ans;
	return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

count_triplets.cpp: In function 'void calc(int, int)':
count_triplets.cpp:56:47: warning: 'v' may be used uninitialized in this function [-Wmaybe-uninitialized]
  if (p) ans -= 2 * (n - 1) * (N - sz[x]) * T[v];
                                            ~~~^
#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...