P6057 [加油武汉]七步洗手法

written on 2022-5-22

被打爆了,做做思路清晰代码简单的水题找找感觉。。

题目要求同色环的数量,是一道统计题,所以可以考虑组合数学。这题显然我们可以用容斥(如果这也算得上的话)来搞,题目要求同色环,那么我们就可以用总数减去异色环的数量来等价。

总数很简单,组合一下即可,这题能被评成绿的唯一原因可能在于异色环数量的统计。

典型而直观的思路:统计每一个点。这题中,对于一个点,如果算上“三角形中这个点连接的两条边是同色”这样的情况,那么统计第三条边是异色这样就会很难算,因此我们不妨试着换一种思考方式。

先来看一张图:

假如强制统计“这个点连接的两条边是异色”,那么对于一个三角形,一个三角形就恰好会被统计两次!于是我们就可以扫描每个点来计算了。

#include<bits/stdc++.h>
using namespace std;
int n,m,cnt[100005];
typedef long long ll;
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		cnt[x]++,cnt[y]++;
	}
	ll all=1ll*n*(n-1)*(n-2)/6,sum=0;
	for(int i=1;i<=n;i++)
	{
		int b=n-1-cnt[i];
		sum+=1ll*b*cnt[i];
	}
	sum/=2;
	printf("%lld\n",all-sum);
}
posted @ 2022-07-31 18:34  Freshair_qprt  阅读(20)  评论(0编辑  收藏  举报