https://vjudge.net/problem/UVALive-5846
题意:
圆周上有n个点,两两相连,只能涂红色或蓝色。求单色三角形的个数。
思路:
这个问题在训练指南105页有详细讲解。
三角形的总个数为C(n,3)。
先求非单色三角形的个数,然后相减得单色三角形个数。
观察上图可以发现非单色三角形会有两个顶点连接异色的两条边,所以对于任意的一个顶点,如果它连接的红边有a[i]条,黑边有(n-1-a[i])条,那么该顶点构成的非单色三角形就有a[i]×(n-1-a[i])个。
将每个顶点构成的非单色三角形相加,因为每个三角形重复算了两遍,最后除2。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
using namespace std; const int maxn=+; int a[maxn]; int main()
{
//freopen("D:\\input.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
memset(a,,sizeof(a));
int n;
scanf("%d",&n);
for(int i=;i<n;i++)
{
for(int j=i+;j<=n;j++)
{
int x;
scanf("%d",&x);
if(x==) {a[i]++;a[j]++;}
}
}
long long ans=n*(n-)*(n-)/;
long long sum=;
for(int i=;i<=n;i++)
sum+=a[i]*(n--a[i]);
printf("%lld\n",ans-sum/);
}
return ;
}