답안 #51927

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
51927 2018-06-22T16:27:30 Z pzdba 철인 이종 경기 (APIO18_duathlon) C++14
31 / 100
289 ms 27600 KB
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
typedef long long LL;

vector<pii> g[100005];
set<int> gs[100005];
bool idx[200005];
int low[100005], vis[100005], p[100005], sz[100005], T = 1;
void dfs1(int u, int p){
	vis[u] = low[u] = T++;
	for(int i=0;i<g[u].size();i++){
		int v = g[u][i].first;
		if(v == p) continue;
		if(vis[v]) low[u] = min(low[u], vis[v]);
		else{
			dfs1(v, u);
			low[u] = min(low[u], low[v]);
			if(low[v] > vis[u]) idx[g[u][i].second] = 1;
		}
	}
}

int root(int a){
	while(p[a] != a){
		p[a] = p[p[a]];
		a = p[a];
	}
	return a;
}
bool merge(int a, int b){
	a = root(a), b = root(b);
	if(a == b) return 0;
	sz[b] += sz[a];
	p[a] = b;
	return 1;
}

LL s[100005], sc[100005];
LL ans = 0;

void dfs2(int u, int p){
	vis[u] = 1;
	for(set<int>::iterator its=gs[u].begin();its != gs[u].end();its++){
		int v = *its;
		if(v == p) continue;
		dfs2(v, u);

		ans += (LL)sc[v]*sz[u]; // f
		if(sz[u] > 1) ans += (LL)s[v]*(sz[u]-1 + (LL)(sz[u]-1)*(sz[u]-2)); // cf

		ans += (LL)sc[v]*s[u]; // f
		ans += (LL)s[v]*sc[u]; // cf


		s[u] += s[v];
		sc[u] += sc[v];
		sc[u] += (LL)s[v]*sz[u];
	}
	s[u] += sz[u];
	sc[u] += (LL)(sz[u]-1)*(sz[u]-1);
}

int main(){
	int n, m;
	scanf("%d%d", &n, &m);
	for(int i=0;i<m;i++){
		int a, b;
		scanf("%d%d", &a, &b);
		g[a].push_back(pii(b, i));
		g[b].push_back(pii(a, i));
	}
	for(int i=1;i<=n;i++){
		if(vis[i]) continue;
		dfs1(i, 0);
	}
	for(int i=1;i<=n;i++) p[i] = i, sz[i] = 1;
	for(int i=1;i<=n;i++){
		for(int j=0;j<g[i].size();j++){
			int v = g[i][j].first, edge = g[i][j].second;
			if(!idx[edge]){
				merge(i, v);
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=0;j<g[i].size();j++){
			int v = g[i][j].first, edge = g[i][j].second;
			if(!idx[edge]) continue;
			if(root(i) == root(v)) continue; 
			gs[root(i)].insert(root(v));
			gs[root(v)].insert(root(i));
		}
	}
	memset(vis, 0, sizeof(vis));
	for(int i=1;i<=n;i++){
		if(vis[i]) continue;
	 	if(root(i) == i) dfs2(i, 0);
	}
	ans *= 2;
	for(int i=1;i<=n;i++){
		if(root(i) == i){
			ans += (LL)sz[i]*(sz[i]-1)*(sz[i]-2);
		}
	}
	printf("%lld\n", ans);
}

Compilation message

count_triplets.cpp: In function 'void dfs1(int, int)':
count_triplets.cpp:12:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<g[u].size();i++){
              ~^~~~~~~~~~~~
count_triplets.cpp: In function 'int main()':
count_triplets.cpp:79:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int j=0;j<g[i].size();j++){
               ~^~~~~~~~~~~~
count_triplets.cpp:87:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int j=0;j<g[i].size();j++){
               ~^~~~~~~~~~~~
count_triplets.cpp:66:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d", &n, &m);
  ~~~~~^~~~~~~~~~~~~~~~
count_triplets.cpp:69:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d", &a, &b);
   ~~~~~^~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 7800 KB Output is correct
2 Correct 9 ms 7860 KB Output is correct
3 Correct 7 ms 7860 KB Output is correct
4 Correct 7 ms 7884 KB Output is correct
5 Correct 7 ms 7884 KB Output is correct
6 Correct 9 ms 8020 KB Output is correct
7 Incorrect 8 ms 8020 KB Output isn't correct
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 7800 KB Output is correct
2 Correct 9 ms 7860 KB Output is correct
3 Correct 7 ms 7860 KB Output is correct
4 Correct 7 ms 7884 KB Output is correct
5 Correct 7 ms 7884 KB Output is correct
6 Correct 9 ms 8020 KB Output is correct
7 Incorrect 8 ms 8020 KB Output isn't correct
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 89 ms 20052 KB Output is correct
2 Correct 92 ms 20180 KB Output is correct
3 Correct 142 ms 22564 KB Output is correct
4 Correct 116 ms 22564 KB Output is correct
5 Correct 142 ms 22564 KB Output is correct
6 Correct 151 ms 22564 KB Output is correct
7 Correct 151 ms 22564 KB Output is correct
8 Correct 172 ms 22564 KB Output is correct
9 Correct 162 ms 22564 KB Output is correct
10 Correct 134 ms 22564 KB Output is correct
11 Correct 113 ms 22564 KB Output is correct
12 Correct 114 ms 22564 KB Output is correct
13 Correct 101 ms 22564 KB Output is correct
14 Correct 103 ms 22564 KB Output is correct
15 Correct 95 ms 22564 KB Output is correct
16 Correct 86 ms 22564 KB Output is correct
17 Correct 12 ms 22564 KB Output is correct
18 Correct 12 ms 22564 KB Output is correct
19 Correct 12 ms 22564 KB Output is correct
20 Correct 12 ms 22564 KB Output is correct
21 Correct 12 ms 22564 KB Output is correct
22 Correct 12 ms 22564 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 22564 KB Output is correct
2 Correct 9 ms 22564 KB Output is correct
3 Correct 8 ms 22564 KB Output is correct
4 Correct 9 ms 22564 KB Output is correct
5 Correct 9 ms 22564 KB Output is correct
6 Correct 8 ms 22564 KB Output is correct
7 Correct 8 ms 22564 KB Output is correct
8 Correct 8 ms 22564 KB Output is correct
9 Correct 9 ms 22564 KB Output is correct
10 Correct 9 ms 22564 KB Output is correct
11 Correct 8 ms 22564 KB Output is correct
12 Correct 8 ms 22564 KB Output is correct
13 Correct 8 ms 22564 KB Output is correct
14 Correct 8 ms 22564 KB Output is correct
15 Correct 8 ms 22564 KB Output is correct
16 Correct 9 ms 22564 KB Output is correct
17 Correct 8 ms 22564 KB Output is correct
18 Correct 8 ms 22564 KB Output is correct
19 Correct 9 ms 22564 KB Output is correct
20 Correct 9 ms 22564 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 174 ms 24032 KB Output is correct
2 Correct 175 ms 24032 KB Output is correct
3 Correct 180 ms 24052 KB Output is correct
4 Correct 186 ms 24052 KB Output is correct
5 Correct 176 ms 24052 KB Output is correct
6 Correct 211 ms 27600 KB Output is correct
7 Correct 191 ms 27600 KB Output is correct
8 Correct 260 ms 27600 KB Output is correct
9 Correct 289 ms 27600 KB Output is correct
10 Correct 193 ms 27600 KB Output is correct
11 Correct 216 ms 27600 KB Output is correct
12 Correct 174 ms 27600 KB Output is correct
13 Correct 174 ms 27600 KB Output is correct
14 Correct 165 ms 27600 KB Output is correct
15 Correct 131 ms 27600 KB Output is correct
16 Correct 100 ms 27600 KB Output is correct
17 Correct 181 ms 27600 KB Output is correct
18 Correct 181 ms 27600 KB Output is correct
19 Correct 173 ms 27600 KB Output is correct
20 Correct 218 ms 27600 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 27600 KB Output is correct
2 Correct 11 ms 27600 KB Output is correct
3 Incorrect 10 ms 27600 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 174 ms 27600 KB Output is correct
2 Correct 201 ms 27600 KB Output is correct
3 Incorrect 178 ms 27600 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 7800 KB Output is correct
2 Correct 9 ms 7860 KB Output is correct
3 Correct 7 ms 7860 KB Output is correct
4 Correct 7 ms 7884 KB Output is correct
5 Correct 7 ms 7884 KB Output is correct
6 Correct 9 ms 8020 KB Output is correct
7 Incorrect 8 ms 8020 KB Output isn't correct
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 7800 KB Output is correct
2 Correct 9 ms 7860 KB Output is correct
3 Correct 7 ms 7860 KB Output is correct
4 Correct 7 ms 7884 KB Output is correct
5 Correct 7 ms 7884 KB Output is correct
6 Correct 9 ms 8020 KB Output is correct
7 Incorrect 8 ms 8020 KB Output isn't correct
8 Halted 0 ms 0 KB -