LA 5846 (计数) Neon Sign

从反面考虑,统计非单色三角形的个数。

如果从一个点出发两条不同颜色的边,那么这三个点一定构成一个非单色三角形。

枚举一个顶点,统计从这个点出发的红边的个数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\n", ans2 - ans1 / 2);

32     }

33 

34     return 0;

35 }
代码君

 

你可能感兴趣的:(sign)