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

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

题意:

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

解法:

方法一:

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

方法二:

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

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

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

则可以列出下列表格:

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

可以列出以下两条等式:

\(A=3\times x+z\quad\quad B=3\times y+2\times z\)

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

所以答案就是\(-2\times 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\n",-2*A+B);
	return 0;
}
posted @ 2019-10-23 16:54  MN2016  阅读(225)  评论(0)    收藏  举报