UVALive5846
Posted Blogggggg
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVALive5846相关的知识,希望对你有一定的参考价值。
题目大意:见刘汝佳《算法竞赛入门经典——训练指南》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的主要内容,如果未能解决你的问题,请参考以下文章
UVALive 3971 Assemble(模拟 + 二分)
UVALive 4726 Average ——(斜率优化DP)