Codeforces Round #142 (Div. 1) C. Triangles

Codeforces Round #142 (Div. 1)

C. Triangles

题目链接

今天校内选拔赛出了这个题,没做出来....自己思维能力还不够强吧。我题也给读错了。。
每次拆掉一条边,可以考虑在原图中会破坏多少三角形,但这也不好统计;所以可以转化一下,在新图中是什么样子的。
原图中会破坏三角形的话,那么在新图中,那些没有被(a,b)两个点连接的点的个数就应当是破坏的个数。这个好统计,就是(n-du[a]-du[b]+)(a,b)同时相连的点的数量。这个容斥一下就出来了。
在新图中新增的三角形的数量就直接是:与(a,b)同时相连的点的数量。
最后求和,那么后面的这个就被抵消了。答案就很好计算了。细节见代码吧:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 5;
ll n, m;
int d[N] ;
int main() {
    ios::sync_with_stdio(false); cin.tie(0);
    cin >> n >> m;
    ll ans = 1ll * n * (n - 1) * (n - 2) / 6;
    for(int i = 1; i <= m; i++) {
        int u, v;
        cin >> u >> v;
        ans -= n - (++d[u]) - (++d[v]) ;
    }
    cout << ans ;
    return 0;
}

自己思维能力还是不够强,还需要多练习才行。

原文地址:https://www.cnblogs.com/heyuhhh/p/10883979.html