제출 #362301

#제출 시각아이디문제언어결과실행 시간메모리
362301BertedDuathlon (APIO18_duathlon)C++14
100 / 100
170 ms50968 KiB
#include <iostream>
#include <vector>
#define ll long long
#define vi vector<int>
#define pii pair<int, int>
#define fst first
#define snd second
using namespace std;

int N, M;
vi adj[100001];

int vis[100001], low[100001], idx = 0, tp[100001], sz[200001];
bool isArc[100001];
vi stack;
vector<vi> comp;

bool done[200001];
vi tree[200001]; 
ll DP[200001][2], temp[200001][2], res = 0;

void DFS(int u, int p)
{
	vis[u] = low[u] = idx++;
	stack.push_back(u);
	for (auto v : adj[u])
	{
		if (vis[v] == -1) 
		{
			DFS(v, u);
			low[u] = min(low[u], low[v]);
			if (low[v] >= vis[u])
			{
				isArc[u] = (vis[u] > 0 || vis[v] > 1);
				comp.push_back({u});
				while (comp.back().back() != v) 
				{
					comp.back().push_back(stack.back());
					stack.pop_back();
				}
			}
		}
		else if (v != p) low[u] = min(low[u], vis[v]);
	}
}

inline int buildBCT()
{
	int cnt = 0;
	for (int i = 0; i < N; i++)
	{
		if (isArc[i]) {tp[i] = cnt; sz[cnt++] = 1;}
	}
	for (const auto &v : comp)
	{
		for (const auto &x : v)
		{
			if (isArc[x])
			{
				tree[tp[x]].push_back(cnt);
				tree[cnt].push_back(tp[x]);
			}
		}
		sz[cnt++] = v.size();
	}
	return cnt;
}

void DFST(int u, int p)
{
	if (done[u]) {return;}

	done[u] = 1;
	for (auto v : tree[u])
	{
		if (v != p)
		{
			DFST(v, u);
			DP[u][0] += DP[v][0];
			DP[u][1] += DP[v][1];
		}
	}
	
	if (sz[u] == 1) 
	{
		DP[u][1] -= DP[u][0]; DP[u][0]++;
		temp[u][0] = 1; temp[u][1] = 0;
		for (auto v : tree[u])
		{
			if (v != p) {temp[v][1] = DP[v][1] - DP[v][0];}
		}
	}
	else 
	{
		ll S = sz[u] - tree[u].size();
		res += S * (S - 1) * (S - 2);
		res += tree[u].size() * S * (S - 1);
		DP[u][0] += S; DP[u][1] += sz[u] * DP[u][0];
		temp[u][0] = S; temp[u][1] = sz[u] * S;
		for (auto v : tree[u])
		{
			if (v != p) {temp[v][1] = DP[v][1] + sz[u] * DP[v][0];}
		}
	}
	
	for (auto v : tree[u])
	{
		if (v != p) 
		{
			res += (DP[u][1] - temp[v][1]) * DP[v][0] + (DP[u][0] - DP[v][0]) * DP[v][1] - 2 * DP[v][0] * (DP[u][0] - DP[v][0]);
			res += temp[u][1] * DP[v][0] + temp[u][0] * DP[v][1] - 2 * DP[v][0] * temp[u][0]; 
		}
	}
}

int32_t main()
{
	ios :: sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin >> N >> M;
	for (int i = 0; i < N; i++) {vis[i] = -1;}
	for (int i = 0; i < M; i++)
	{
		int u, v; cin >> u >> v;
		adj[u - 1].push_back(v - 1);
		adj[v - 1].push_back(u - 1);
	}
	for (int i = 0; i < N; i++)
	{
		if (vis[i] == -1) {DFS(i, -1);}
	}
	N = buildBCT();
	for (int i = 0; i < N; i++)
	{
		if (sz[i] > 1)
		{
			DFST(i, -1);
		}
	}

	cout << res << "\n";
	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...