三角形计数

**三角形计数** **时间限制: 3 Sec 内存限制: 8 MB**
**题目描述** 【背景】 Day1T1当然是又裸又水的题了怎么会有背景呢。 【题目描述】 给定n个点的坐标(0<=xi,yi<=10000)求选出任意三个点能组成的三角形的总面积。 **输入** 第一行n表示点数。接下来每行两个数xi,yi表示点的坐标。 **输出** 一行一个浮点数保留一位小数表示面积和。 **样例输入** 5 0 0 1 2 0 2 1 0 1 1 **样例输出** 7.0 **提示** 【样例解释】 ![](https://img-blog.csdn.net/20180715092603372) 【数据范围】 ![](https://img-blog.csdn.net/20180715093555868) 数据为随机生成。 T1 xi yi为整数 T1 第6~8个测试点满足:对于所有满足xmin<=xi<=xmax且ymin<=yi<=ymax的点都会出现在数据中且没有重复的点。 例如:(6,6) (6,7) (6,8) (7,6) (7,7) (7,8) (8,6) (8,7) (8,8) **题解:** 等价于求$$\sum_{i=1}^n\sum_{j=i+1}^n\sum_{k=j+1}^n|(x_j− x_ i )(y_ k − y_ i ) − (x_ k − x_ i )(y_ j − y_ i )|$$ 枚举$i$并将$i$所在的点看作原点,将所以向量按斜率排序,去掉绝对值并化简,假设新坐标为$(X_i,Y_i)$。 等价于求$$\sum_{j=i+1}^n\sum_{k=j+1}^nX_jY_k-X_kY_j$$ 使用前缀和计算即可。 $Code:$
#include<bits/stdc++.h>  
#define ll long long 
using namespace std; 
int n; 
ll sumx,sumy,ans; 
struct node  
{ 
    int x,y; 
}p[3005]; 
struct line 
{ 
    int x,y; 
    double k; 
}b[3005]; 
bool cmp1(node p1,node p2) 
{ 
    return p1.y>p2.y; 
} 
bool cmp2(line l1,line l2) 
{ 
    return l1.k<l2.k; 
} 
int main() 
{ 
    scanf("%d",&n); 
    for(int i=1;i<=n;i++) 
        scanf("%d%d",&p[i].x,&p[i].y); 
    sort(p+1,p+n+1,cmp1); 
    for(int i=3;i<=n;i++) 
    { 
        for(int j=1;j<i;j++) 
        { 
            b[j].x=p[j].x-p[i].x; 
            b[j].y=p[j].y-p[i].y; 
            b[j].k=atan2(b[j].y,b[j].x); 
        } 
        sort(b+1,b+i,cmp2); 
        sumx=b[1].x;sumy=b[1].y; 
        for(int j=2;j<i;j++) 
        { 
            ans+=(ll)sumx*b[j].y-(ll)sumy*b[j].x; 
            sumx+=b[j].x;sumy+=b[j].y; 
        } 
    } 
    if(ans%2==0)printf("%lld.0\n",ans/2); 
    else printf("%lld.5\n",ans/2); 
} 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jack-Oran

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值