CF142 Div1 C - Triangles
問題
n頂点の完全無向グラフがあり、そこからアリスはm本の辺を取り、残りの辺はボブに渡した
二人が持っているグラフそれぞれにおける長さ3の閉路(=triangleと呼ぶ)の個数の和を求めよ
1 <= n <= 10^6
0 <= m <= 10^6
解法
各頂点を1個ずつ見ていき、その頂点に繋がっているn-1本の辺から2本選んでできるペア全てについて
両方の辺がアリスかボブのグラフに含まれる場合) +2をスコアに足す
片方はアリス、他方はボブのグラフに含まれる場合) -1をスコアに足す
としていく
するとアリスorボブのグラフでtriangleになっている部分はスコア6点分にあたり、triangleになっていない部分は0点にあたる
だからこのスコアを最後に6で割ったものが答えになる
アリスのグラフで頂点vに直接繋がっている辺の本数をdとすると、ボブのグラフでのそれは当然n-d-1本になり、スコアの増分は
2(dC2) - d(n-d-1) + 2((n-d-1)C2)
となるから合計スコアはO(n)で計算できる
この解法天才すぎない?数オリかよ
ll n, m, a, b, e[1001001], ans; signed main() { cin >> n >> m; rep(i,m) { cin >> a >> b; a--, b--; e[a]++, e[b]++; } rep(i,n) { ll d = e[i]; ans += d*(d-1) - d*(n-d-1) + (n-d-1)*(n-d-2); } cout << ans/6 << endl; }