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);
}