CodeForces

来源:互联网 发布:室内装修设计软件 编辑:程序博客网 时间:2024/06/06 05:24

原题链接

 题意给定n(1<=n<=10^6)个点组成的完全图,现在从原图中拿走m(0<=m<=10^6)条边到另一个平面上,问一共还能组成多少个三角形。

分析:比赛时一点思路也没有,后来看别人博客写的。求还剩下多少个三角形,比较麻烦,如果求拿走一些边后,破坏啦多少个三角形就比较容易获得答案。我们先设拿走的变为黑边,还留在平面的边为白边。对于任意一个点,他的一条黑边和一条白边加上第三条边(无论黑白)即是一个破环的三角形。这样每个三角形会计算两次(破坏的只能是黑黑白,或者白白黑,前者统计啦两次白黑,后者统计啦两次黑白),然后用C(3,n)减掉破环的三角形就是答案啦

#include<bits/stdc++.h>const int N=1e6;typedef long long LL;LL d[N+10],ans,n,m,sum;int main(){       int x,y;    scanf("%lld%lld",&n,&m);    sum=n*(n-1)/2*(n-2)/3;    while(m--)    {scanf("%d%d",&x,&y);     d[x]++;d[y]++;    }    for(int i=1;i<=n;i++)        ans=ans+(d[i]*(n-1-d[i]));    ans/=2;    printf("%I64d\n",sum-ans);    return 0;}