首页 > 代码库 > LA 5846 霓虹灯广告牌(单色三角形问题)

LA 5846 霓虹灯广告牌(单色三角形问题)

https://vjudge.net/problem/UVALive-5846

题意:

圆周上有n个点,两两相连,只能涂红色或蓝色。求单色三角形的个数。

 

思路:

技术分享

这个问题在训练指南105页有详细讲解。

三角形的总个数为C(n,3)。

先求非单色三角形的个数,然后相减得单色三角形个数。

观察上图可以发现非单色三角形会有两个顶点连接异色的两条边,所以对于任意的一个顶点,如果它连接的红边有a[i]条,黑边有(n-1-a[i])条,那么该顶点构成的非单色三角形就有a[i]×(n-1-a[i])个。

将每个顶点构成的非单色三角形相加,因为每个三角形重复算了两遍,最后除2。

 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<vector> 6 #include<stack> 7 #include<queue> 8 #include<cmath> 9 #include<map>10 using namespace std;11 12 const int maxn=1000+5;13 14 int a[maxn];15 16 int main()17 {18     //freopen("D:\\input.txt","r",stdin);19     int T;20     scanf("%d",&T);21     while(T--)22     {23         memset(a,0,sizeof(a));24         int n;25         scanf("%d",&n);26         for(int i=1;i<n;i++)27         {28             for(int j=i+1;j<=n;j++)29             {30                 int x;31                 scanf("%d",&x);32                 if(x==1)  {a[i]++;a[j]++;}33             }34         }35         long long ans=n*(n-1)*(n-2)/6;36         long long sum=0;37         for(int i=1;i<=n;i++)38             sum+=a[i]*(n-1-a[i]);39         printf("%lld\n",ans-sum/2);40     }41     return 0;42 }

 

LA 5846 霓虹灯广告牌(单色三角形问题)