关于面积的问题,如何解决?

问题遇到的现象和发生背景

平面内有n个点,每个点坐标为xi,yi,统计其中所有三角形面积之和(无论它们是否重叠)。输出保留一位小数。

样例输入:

5              //这一行是n
0 1            //下面n行是xi,yi
1 0
1 1
2 1
1 2

样例输出:

6.0

数据范围:

n<=3000
|xi|,|yi|<=1e4
问题相关代码,请勿粘贴截图
#include<bits/stdc++.h>
using namespace std;
int n;
double s=0.0;
struct node{
    int x,y;
}a[3001];
bool cmp(node a,node b){
    if(a.x!=b.x){
        return a.x<b.x;
    }
    return a.y<b.y;
}
//判断向量AC在向量AB的哪个方位,true表示逆时针,false表示顺时针
bool dir(node a,node b,node c){
    int x1=b.x-a.x,x2=c.x-a.x,y1=b.y-a.y,y2=c.y-a.y;
    return x1*y2-x2*y1>0;
}
//求三角形面积
double area(node a,node b,node c){
    return fabs(0.5*(a.x*b.y+b.x*c.y+c.x*a.y-a.x*c.y-b.x*a.y-c.x*b.y));
}
void calc(bool flag,int l,int r){
    double tmp=-1.0;
    int k=0;
    for(int i=l+1;i<=r-1;i++){
        if(dir(a[l],a[r],a[i])!=flag){
            continue;
        }
        double t=area(a[l],a[r],a[i]);
        if(tmp<t){
            tmp=t;
            k=i;
        }
    }
    if(k==0){
        return ;
    }
    s+=tmp;
    calc(flag,l,k);
    calc(flag,k,r);
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i].x>>a[i].y;
    }
    sort(a+1,a+n+1,cmp);
    //分治法求凸包面积
    calc(true,1,n);
    calc(false,1,n);
    printf("%.1lf",s*(n-2));
    return 0;
}
运行结果及报错内容

Wrong Answer,24分(满分100分)。

我的解答思路和尝试过的方法

我先画了几张图找了找规律,然后得出(错误的)结论:面积和=凸包面积*(n-2),于是套用了这个公式。

我想要达到的结果

AC,得满分。