【组合数学】Bzoj2916 [Poi1997]Monochromatic Triangles

本文深入探讨了一种快速计算空间中给定点间形成的同色三角形总数的方法。通过分析三角形边的颜色特性,提出了一种利用点间红线数量计算同色三角形数量的算法。该算法效率高,适用于大规模数据集。具体步骤包括统计每个点的红线数量,并据此计算每个可能的三角形的贡献值,最后通过数学公式汇总结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

空间中有n个点,任意3个点不共线。每两个点用红线或者蓝线连接,如果一个三角形的三边颜色相同,那么称为同色三角形。给你一组数据,告诉你哪些点间有一条红线,计算同色三角形的总数。
n<=1000,m<=250000。
 

题解

感觉同色不太好做?

那杂色呢?好做得不得了啊,一个杂色三角形肯定有一对红蓝边

那么我们考虑连接红蓝边的点的贡献

统计了点u连红边条数为t[u],那么贡献就是t[u]*(n-t[u]-1)

求sigma之后再除二,每个三角形被考虑两次

再用C(n,3)相减就可以了,C(n,3)还可以直接求

于是秒之

 

代码

一鼓作气切掉此题,感觉非常爽

#include<cstdio>
const int maxn=1e3+5;

int t[maxn];
int n,m,u,v,ans;
int main(){
    scanf("%d%d",&n,&m);
    ans=n*(n-1)*(n-2)/3;
    
    for(int i=1;i<=m;i++){
        scanf("%d%d",&u,&v);
        t[u]++;t[v]++;
    }
    
    for(int i=1;i<=n;i++)
        ans-=t[i]*(n-t[i]-1);
        
    printf("%d\n",ans/2);
    return 0;
}

 

转载于:https://www.cnblogs.com/xkui/p/4540358.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值