제출 #407766

#제출 시각아이디문제언어결과실행 시간메모리
407766oolimryDuathlon (APIO18_duathlon)C++17
100 / 100
219 ms30388 KiB
#include <bits/stdc++.h>
using namespace std;
#define all(x) (x).begin(), (x).end()
#define sz(x) ((int) x.size())
#define show(x) cerr << #x << " is " << x << endl;
#define show2(x, y) cerr << #x << " is " << x << ", " << #y << " is " << y << endl;
#define show3(x, y, z) cerr << #x << " is " << x << ", " << #y << " is " << y << ", " << #z << " is " << z << endl;
typedef long long lint;
typedef pair<int, int> ii;

int n, m; 
int low[100005];
int depth[100005];
vector<int> adj[100005];
vector<int> tree[200005];
int cnt;
stack<int> S;
lint num = 0;
void tarjan(int u){
	low[u] = depth[u];
	S.push(u);
	num++;
	for(int v : adj[u]){
		if(low[v] == 0){ ///not visisted
			depth[v] = depth[u]+1;
			tarjan(v);
			low[u] = min(low[u], low[v]);
			if(low[v] >= depth[u]){
				while(true){
					int nv = S.top();
					tree[cnt].push_back(nv);
					tree[nv].push_back(cnt);
					S.pop();
					if(nv == v) break;
				}
				tree[cnt].push_back(u);
				tree[u].push_back(cnt);
				cnt++;
			}
		}
		else if(depth[v] != depth[u]-1) low[u] = min(low[u], depth[v]);
	}
}

lint ans = 0;
lint sz[200005];
lint weight[200005];
void dfs(int u, int p){
	sz[u] = (u <= n);
	if(u <= n) weight[u] = -1;
	else weight[u] = sz(tree[u]);
	for(int v : tree[u]){
		if(v != p){
			dfs(v, u);
	
			ans += weight[u] * (2LL * sz[v] * sz[u]);
			sz[u] += sz[v];
		}
	}
	
	ans += weight[u] * (2LL * sz[u] * (num-sz[u]));
}


int main(){
	ios_base::sync_with_stdio(false); cin.tie(0);
	
	cin >> n >> m;
	cnt = n+1;
	
	for(int i = 1;i <= m;i++){
		int a, b; cin >> a >> b;
		adj[a].push_back(b);
		adj[b].push_back(a);
	}
	
	for(int i = 1;i <= n;i++){
		if(depth[i] == 0){
			depth[i] = 1; num = 0; while(not S.empty()) S.pop();
			tarjan(i);
			dfs(i, 0);
		}
	}
	
	cout << ans;
}
#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...