[POI1997] 单色三角形

solution:

      这题可以暴力,真的,第一遍抱着试试的心理用暴力过了,数据太水,不到立方的效率竟然过了。

     正解容斥原理(来自大佬http://blog.csdn.net/xy20130630):    

        为了解决这道题目,我们需要有一个转换的思想。因为三角形总数,是等于单色三角形的数量加上不单色三角形的数量(好拗口),而三角形的总数等于C(n,3)(因为任意三个点都可以连成一个三角形),所以求单色三角形的数量,就可以转化为求不单色三角形的数量,我们发现,对于一个点,如果它往外连出了两条异色边,那么这两条异色边一定会与另一条边构成一个不单色三角形。

因为每一个点的出度都为n-1,所以,如果记点i连出的红色边的数量为d[i],那么它连出的蓝色边的数量就为(n-1-d[i]),那么此点连出的异色边的数量(一对一对地数)就为(d[i])(n-1-d[i])。根据上图,点A,B连出的不单色三角形的数量会有重复,所以不单色三角形的数量为异色边总对数除以2。

综上,单色三角形的数量=三角形总数-不单色三角形的数量=

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 int n,m,ans;
 5 int d[1001];
 6 int read() {
 7     int s=0,f=1;
 8     char ch=getchar();
 9     for(; ch<‘0‘||ch>‘9‘; ch=getchar()) {
10         if(ch==‘-‘) {
11             f=-1;
12         }
13     }
14     for(; ch>=‘0‘&&ch<=‘9‘; ch=getchar()) {
15         s=(s<<1)+(s<<3)+(ch^48);
16     }
17     return s*f;
18 }
19 int main() {
20     //freopen("tro.in","r",stdin);
21     //freopen("tro.out","w",stdout);
22     n=read(),m=read();
23     for(int x,y,i=1; i<=m; ++i) {
24         x=read(),y=read();
25         ++d[x];
26         ++d[y];
27     }
28     for(int i=1; i<=n; ++i) {
29         ans+=(d[i]*(n-1-d[i]));
30     }
31     printf("%d\n",n*(n-1)*(n-2)/6-ans/2);
32     return 0;
33 }
时间: 2024-08-23 13:11:27

[POI1997] 单色三角形的相关文章

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])个. 将每

单色三角形

Description 在空间中给出了n个点.这些点任三点不共线,并且每两个点之间都有一条线相连,每一条线不是红的就是黑的.在这些点和线组成的三角形中,如果一个三角形的三条边的颜色都相同,那么我们就称这个三角形为单色三角形.现给出所有涂红色的线,试求出单色三角形的数目. Input 输入文件的第一行有一个整数T,表示下面有T组测试数据.接下来的行是T组测试数据的描述.每一组测试数据的第1行是两个整数n和m,其中整数n表示点数,m是红色边的数目,(0 <= m <= 250000, 3 <

HDU 5072 Coprime (单色三角形问题+容斥原理)

我们先来介绍一下单色三角形问题,如下 单色三角形 在空间中给出了n个点.这些点任三点不共线,并且每两个点之间都有一条线相连,每一条线不是红的就是黑的.在这些点和线组成的三角形中,如果一个三角形的三条边的颜色都相同,那么我们就称这个三角形为单色三角形.现给出所有涂红色的线,试求出单色三角形的数目. 任务: 请写一个程序: 从文本文件中读入点数和对红色连线的描述: 找出该图中红色三角形的数目: 把结果输出到文件TRO.OUT中. 输入格式: 在文本文件TRO.IN的第一行包括一个整数n,3 <= n

HDU 5072 Coprime (单色三角形+容斥原理)

题目链接:Coprime 题面: Coprime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 1181    Accepted Submission(s): 471 Problem Description There are n people standing in a line. Each of them has a uniq

Coprime (单色三角形+莫比乌斯反演(数论容斥))

这道题,先说一下单色三角形吧,推荐一篇noip的论文<国家集训队2003论文集许智磊> 链接:https://wenku.baidu.com/view/e87725c52cc58bd63186bd1b.html?from=search 单色三角形指的是n个顶点,有n(n-1)条边,很明显是每个点两两相连,那么这样所形成的所有三角形的边假如有两种颜色:红和黑.那么问一共有多少三角形的三边是一种颜色的个数. ,建议看一下那个论文,因为我只能直接给出你结论.  下面的数学符号:{...}为概率论中表

单色三角形问题

给定空间里n(n<=1000)个点,假设任意三个点都不共线. 将任意两点之间的连线涂上红色或者黑色. 问3条边同色的三角形个数. 分析: 由于三角形总数C(n,3),所以求出异色三角形个数就求出了同色三角形个数. 我们发现这样的对应关系,一个异色三角形存在两个顶点,该三角形中与它们相邻的两边是不同色的:而对从一个顶点出发的两条异色边都属于一个异色三角形.这是个一对二的关系. 设第i个点连接了ai条红边.n-1-ai条黑边,这些边一定属于ai(n-1-ai)个不同的异色三角形.由于异色三角形都会被

BZOJ 2916[Poi1997]Monochromatic Triangles

题面: 2916: [Poi1997]Monochromatic Triangles Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 340  Solved: 175[Submit][Status][Discuss] Description 空间中有n个点,任意3个点不共线.每两个点用红线或者蓝线连接,如果一个三角形的三边颜色相同,那么称为同色三角形.给你一组数据,计算同色三角形的总数. Input 第一行是整数n, 3 <= n <= 1000,

【bzoj 2916】[Poi1997]Monochromatic Triangles

题目描述 空间中有n个点,任意3个点不共线.每两个点用红线或者蓝线连接,如果一个三角形的三边颜色相同,那么称为同色三角形.给你一组数据,计算同色三角形的总数. 输入 第一行是整数n, 3 <= n <= 1000,点的个数. 第二行是整数m, 0 <= m <= 250000,红线数目. 接下来的m行,每行两个数p和k,1 <= p < k <= n.表示一条红线的两个端点. 输出 一个整数,单色三角形的数目. 样例输入 6 9 1 2 2 3 2 5 1 4 1

hdu 5072 Coprime(同色三角形+容斥)

pid=5072">http://acm.hdu.edu.cn/showproblem.php?pid=5072 单色三角形模型 现场赛和队友想了3个小时,最后发现想跑偏了.感觉好可惜的一道题,要是知道这个模型....就能够轻松的拿银了啊. . . 题意不再赘述,就是求同色三角形的个数.总的三角形的个数是C(n,3),仅仅需减去不同色的三角形就可以.对于每一个点(数),与它互质的连红边,不互质的连蓝边,那么对于该点不同色三角形个数为蓝边数*红边数/2,由于同一个三角形被计算了两次. 那么同