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 }
代码君

 

posted @ 2015-03-25 21:53  AOQNRMGYXLMV  阅读(246)  评论(0编辑  收藏  举报