题解 LA5846
题目大意 多组数据,每组数据给定一个有 \(n\) 个点的圆,每两点之间连一条线段,每条线段只能为红蓝两色。给定线段的颜色,求单色三角形的个数。
分析 不难想到找出不单色三角形的个数。考虑一个不单色三角形,则其有且仅有两个顶点连出了两条不同颜色的线段。那么可以枚举每个顶点,由该顶点组成的不单色三角形个数为该顶点连出的红边个数乘以蓝边个数。将答案累加后除以二,再用总个数去减它即为答案。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1005;
int T, n, ans;
int red[maxn];
inline int Read()
{
int x = 0, op = 1;
char ch = getchar();
while(ch < '0' || ch > '9') {
if(ch == '-') op = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9') {
x = (x << 3) + (x << 1) + (ch - '0');
ch = getchar();
}
return x * op;
}
int main()
{
T= Read();
while(T--) {
memset(red, 0, sizeof red);
n = Read(), ans = 0;
for(int i = 1; i <= n; ++i) {
for(int j = i + 1; j <= n; ++j)
if(Read()) ++red[i], ++red[j];
ans += red[i] * (n - red[i] - 1);
}
printf("%d\n", n * (n - 1) * (n - 2) / 6 - ans / 2);
}
}