计蒜客T2202 数三角形(提高组2017模拟赛(三)day2T3) LZOJ3878攻略

今天模拟赛考了一道计蒜客NOIP2017模拟赛(三)day2T3的数三角形,原题链接 https://nanti.jisuanke.com/t/T2202 ,LZOJ3878攻略。场上想了很久都没转化出来,后来觉得这道想法题很妙,记录一下。

题意:

数出一个完全图中完全异色三角形( imes 3)-完全同色三角形( imes 6)的答案是多少。

解法:

方法一:

转化为:题目本质上是出现同色三角形好感度-9,出现两条边相等另一条不同的三角形好感度-3, 数一数同色角的个数就行了

方法二:

个人感觉很好理解的,比方法一要好。

(A)为同色角的个数(同色角是指一个顶点连接的两条边颜色相同),(B)为异色角的个数。

设三角形中三条边同色的个数为(x),三条边均不同颜色的个数为(y),其他三角的个数有(z)个。

则可以列出下列表格:

三条同色边三角形(x) 三条异色边三角形(y) 其他三角形(z)
(A) 3 0 1
(B) 0 3 2

可以列出以下两条等式:

(A=3 imes x+zquadquad B=3 imes y+2 imes z)

而题目要求同色三角形权值为(-6),异色三角形权值为(3),即(-6 imes x+3 imes y)

所以答案就是(-2 imes A+B)

#include<cstdio>
using namespace std;

const int maxn=100010;
int n,m,a[maxn][2];
long long A,B;

int main()
{
	int i,x,y,z;
	scanf("%d%d",&n,&m);
	for (i=1;i<=m;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		z--;
		a[x][z]++,a[y][z]++;
	}
	for (i=1;i<=n;i++)
	{
		x=a[i][0],y=a[i][1],z=n-1-x-y;
		A+=(1ll*x*(x-1)>>1)+(1ll*y*(y-1)>>1)+(1ll*z*(z-1)>>1);
		B+=1ll*x*y+1ll*y*z+1ll*z*x;
	}
	printf("%lld
",-2*A+B);
	return 0;
}
原文地址:https://www.cnblogs.com/Ronald-MOK1426/p/11727272.html