今天模拟赛考了一道计蒜客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;
}