Submission #958537

#TimeUsernameProblemLanguageResultExecution timeMemory
958537Cyber_WolfDuathlon (APIO18_duathlon)C++17
100 / 100
81 ms39116 KiB
#include <bits/stdc++.h>

using namespace std;

#define lg long long
#define fastio ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);

const lg N = 2e5+5;

vector<lg> adj[N],adj2[N], p, comps[N];
lg low[N], ans, n, m, artic[N], tin[N], tmp, vis[N], id[N], ids, sz[N], n2;

void dfs(lg src, lg par = -1)
{
	low[src] = tin[src] = ++tmp;
	n2++;
	p.push_back(src);
	for(auto it : adj[src])
	{
		if(it == par)
		{
			continue;
		}
		if(tin[it])
		{
			low[src] = min(low[src], tin[it]);
			continue;
		}
		dfs(it, src);
		low[src] = min(low[src], low[it]);
		if(low[it] >= tin[src])
		{
			artic[src] = (tin[src] > 1 || tin[it] > 2);	
			ids++;
			adj2[src].push_back(n+ids);
			while(adj2[n+ids].empty() || adj2[n+ids].back() != it)
			{
				adj2[n+ids].push_back(p.back());
				p.pop_back();
			}
		}
	}
}

void dfs2(lg src)
{
	sz[src] = (src <= n);
	vis[src] = true;
	lg x = adj2[src].size();
	for(auto it : adj2[src])
	{
		if(vis[it])	continue;
		dfs2(it);
		sz[src] += sz[it];
		if(src > n)
		{
			ans -= sz[it]*(sz[it]-1)*x;
		}
	}
	if(src > n)
	{
		ans -= (n2-sz[src])*(n2-sz[src]-1)*x;
	}
}

int main()
{
	fastio;
	cin >> n >> m;
	for(int i = 0; i < m; i++)
	{
		lg u, v;
		cin >> u >> v;
		adj[u].push_back(v);
		adj[v].push_back(u);
	}
	for(int i = 1; i <= n; i++)
	{
		if(tin[i])	continue;
		n2 = 0;
		dfs(i);
		ans += n2*(n2-1)*(n2-2);
		dfs2(i);
	}
	cout << ans << '\n';

    return 0;
}

/*
123 c
124 c
134 c
132 x
142 x
143 x



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