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;
}
自己思维能力还是不够强,还需要多练习才行。