题解 P6057 【[加油武汉]七步洗手法】
补集转化思想经典题目,值得一做。
也正是因此,我一直以为洛谷早就有这道题了。
暴力枚举求同色三角形的算法时间复杂度为
可以看出,同色三角形数目
考虑如何求异色三角形数目。
定义两边颜色不同的角为异色角。显然每个异色三角形中有两个异色角,且所有异色三角形的异色角都不属于其他异色三角形。
对每个点统计异色角的数目,再除以
时间复杂度
答案是long long!
代码:
#include<cstdio>
#define reg register
#define MAXN 100001
using namespace std;
typedef long long ll;
int deg[MAXN];
ll ans=0;
int n,m;
int main()
{
scanf("%d %d",&n,&m);
for(reg int i=1;i<=m;i++)
{
int u,v;
scanf("%d %d",&u,&v);
++deg[u],++deg[v];
}
for(reg int i=1;i<=n;i++)
ans+=(1ll*deg[i]*(n-1-deg[i]));
printf("%lld",1ll*n*(n-1)*(n-2)/6-(ans>>1));
return(0);
}