2024.11.05模拟赛( — _ — )
晚上是个好时候,可以肆无忌惮地想很多事、想人
前言
然后呢,早上困得要死。困到什么地步了呢?困到T3T4读下来之后就全都忘了。是一点都不记得了那种。本来想着去厕所睡会儿,结果被那里的味道和冷空气劝退了。回到教室之后,才慢慢地清醒了过来,仔细推了下T1,又打了T2的暴力,T3T4实在不知道怎么写,就没有写。没有挂分,这是一件非常好的事情,T1 100分,T2 20分,共120分,开开心心开始订T2。
T1【同色三角形】
题目大意:
给定一张有n(1<=n<=1e5)个节点的无向完全图,给出m(1<=m<=3e5)条白边,剩下的边为黑边,求同色的三(三)元(角)环(形)的个数。
解题思路:
小小地运用一些排列组合的方法,可以求出这个图中所有边的数量。我们可以想到:若有一条边变成了白边,那么原本以这条白边组成的三角形就不合法了。每条边可以组成n-2个不同的三角形,所以所有白边的出现共会导致m*(n-2)个三角形不合法。
但是!若一个三角形有两条白边,它理应只被更新一次,却被两个白边更新了两次。这时候,我们就容斥一下,对于每个点,如果它的度数超过一(即出现上述情况),那么就要把每个三角形多减的加回来,也就是d[i]*(d[i]-1)/2(很好理解对叭)。
那要是一个三角形全是白边呢?我们可以想象:这个三角形第一次被减了3,第二次又加回了3(因为它会被每一条边都更新一遍),此时就相当于它仍被记了一个数,这正是我们想要的,所以就不用管。
可爱的小代码
#incIude <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
int n,m;
int d[N];
int tol;
signed main()
{
scanf("%lld%lld",&n,&m);
for (int i=1;i<=m;i++)
{
int u,v;
scanf("%lld%lld",&u,&v);
d[u]++;
d[v]++;
}
tol=n*(n-1)*(n-2)/6;
tol-=(n-2)*m;
for (int i=1;i<=n;i++)
{
if (d[i]>1) tol+=d[i]*(d[i]-1)/2;
}
printf("%lld",tol);
return 0;
}
T2T3T4没有讲,题解也看不懂,不会不会