码迷,mamicode.com
首页 > 其他好文 > 详细

UVALive5846

时间:2017-10-08 01:00:14      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:直接   class   using   mes   ++   训练指南   pac   max   amp   

题目大意:见刘汝佳《算法竞赛入门经典——训练指南》P173。

解题思路:

  如果要直接求所有单色三角形的个数似乎不简单,正难则反,先求出所有非单色三角形 cnt,answer = C(n,3)- cnt。

  首先,对于每一个非单色三角形,一定有2个点对应一对异色边,那么我们只需要统计每一个点连接的红边或者蓝边数 t,则这个点连接的异色三角形个数为:t*(n - 1 - t),把各边的异色三角形个数加起来。按照这种方式,对于每一个非单色三角形我们都会从它的2个连接着一对异色边的点计算各一次,所以我们要将得到的异色三角形总数除以二就可以得到正确的 cnt。

AC代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 
 5 using namespace std;
 6 typedef long long ll;
 7 const int maxn=1003;
 8 bool color[maxn][maxn];
 9 int main()
10 {
11     int T,tmp;
12     int N;
13     scanf("%d",&T);
14     while(T--){
15         ll t1=0;
16         scanf("%d",&N);
17         for(int i=1;i<N;i+=1){
18             for(int j=i+1;j<=N;j+=1){
19                 scanf("%d",&tmp);
20                 if(tmp) color[i][j]=color[j][i]=true;
21                 else    color[i][j]=color[j][i]=false;
22             }
23         }
24         for(int i=1;i<=N;i++){
25             ll on=0;
26             for(int j=1;j<=N;j++){
27                 if(i==j)    continue;
28                 if(color[i][j]) on++;
29             }
30             t1+=(on*(N-1-on));
31         }
32         ll ans=(ll)N*(N-2)*(N-1)/6-t1/2;
33         printf("%lld\n",ans);
34     }
35     return 0;
36 }

 

UVALive5846

标签:直接   class   using   mes   ++   训练指南   pac   max   amp   

原文地址:http://www.cnblogs.com/Blogggggg/p/7636308.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!