从反面考虑,统计非单色三角形的个数。
如果从一个点出发两条不同颜色的边,那么这三个点一定构成一个非单色三角形。
枚举一个顶点,统计从这个点出发的红边的个数a[i]和蓝边的个数n - 1 - a[i],这样以该点为顶点的非单色三角形的数目为a[i] * (n - 1 - a[i])
由于每个单色三角形计数了两次,所以总单色三角形的个数为sum{ a[i] * (n - 1 - a[i]) | 1 ≤ i ≤ n } / 2
最后一共有C(n, 3)个三角形,用总的减去所求就是答案。
1 #include <cstdio> 2 3 const int maxn = 1000 + 10; 4 int a[maxn][maxn]; 5 6 int main() 7 { 8 //freopen("in.txt", "r", stdin); 9 10 int T; 11 scanf("%d", &T); 12 while(T--) 13 { 14 int n; 15 scanf("%d", &n); 16 for(int i = 1; i < n; i++) 17 for(int j = i + 1; j <= n; j++) 18 { 19 int x; 20 scanf("%d", &x); 21 a[i][j] = a[j][i] = x; 22 } 23 long long ans1 = 0; 24 for(int i = 1; i <= n; i++) 25 { 26 int t = 0; 27 for(int j = 1; j <= n; j++) if(i != j) t += a[i][j]; 28 ans1 += (long long)t * (n - 1 - t); 29 } 30 long long ans2 = n * (n-1) / 2 * (n-2) / 3; 31 printf("%lld ", ans2 - ans1 / 2); 32 } 33 34 return 0; 35 }