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没有讲,题解也看不懂,不会不会

posted @ 2024-11-05 15:07  还是沄沄沄  阅读(5)  评论(2编辑  收藏  举报