JZOJ3493 三角形

Description
  平面上有n个点,求出用这些点可以构成的三角形数。
Input
  第一行一个整数n。

  接下来n行,每行两个整数,表示点的坐标。
Output
  输出仅一个整数,表示所求答案。
Sample Input
  5
  0 0
  1 1
  1 -1
  -1 -1
  -1 1
Sample Output
  8
Data Constraint
  对于50%的数据,n<=300。

  对于100%的数据,n<=3000,坐标的绝对值不超过10^4,保证没有重合的点。
 

Solution

  枚举第一个点,对于剩下的点按照和这个点连线的斜率排序一下,把相同斜率的线段放在一起,可以算出选到两条相同斜率的线段方案数,即不能构成三角形的方案数,然后统计答案。注意处理斜率不存在的情况。

 1 #pragma GCC optimize(2)
 2 #include<cstdio>
 3 #include<algorithm>
 4 using namespace std;
 5 int l,n,a[4000],b[4000],sum,r;
 6 long long ans;
 7 double d[9500000];
 8 int main()
 9 {
10     scanf("%d",&n);
11     for (int i=1;i<=n;i++)
12         scanf("%d%d",&a[i],&b[i]);
13     ans=(n*(n-1))/2;
14     ans=(ans*(n-2))/3;
15     for (int i=1;i<=n-1;i++)
16     {
17         l=0;r=0;
18         for (int j=i+1;j<=n;j++)
19             if (a[j]-a[i]==0) 
20                 r++;
21             else
22                 d[++l]=(double(b[j]-b[i]))/(double(a[j]-a[i]));
23         sort(d+1,d+l+1);
24         sum=1;
25         for (int j=2;j<=l;j++)
26             if (d[j]==d[j-1])
27                 sum++;
28             else
29             {
30                 ans=ans-((sum*(sum-1))/2);
31                 sum=1;
32             }
33         ans=ans-((sum*(sum-1))/2);
34         ans=ans-(r*(r-1))/2;
35     }
36     printf("%lld",ans);
37 }
View Code

 

转载于:https://www.cnblogs.com/Tokisaki-Kurumi/p/9432973.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值