链接

:alt alt

#include <bits/stdc++.h>

using namespace std;
const double eps=1e-8;
typedef long long ll;
int sgn(double x){
    if(fabs(x)<eps) return 0;
    if(x<0) return -1;
    else return 1;
}
int x,x2,x3;
int y,y2,y3;
struct Point{
    double x,y;
    Point(){}
    Point(double _x,double _y){
        x=_x;
        y=_y;
    }
    bool operator <(Point b)const{
        return sgn(x-b.x)==0?sgn(y-b.y)<0:x<b.x;
    }
    Point operator -(const Point &b)const{
        return Point(x-b.x,y-b.y);
    }
    bool operator ==(Point b)const{
        return sgn(x-b.x)==0&&sgn(y-b.y)==0;
    }
    //叉积
    double operator ^(const Point &b)const{
        return x*b.y-y*b.x;
    }
    //点积
    double operator *(const Point &b)const{
        return x*b.x+y*b.y;
    }
};
struct Line{
    Point s,e;
    Line(){}
    Line(Point _s,Point _e){
        s=_s;
        e=_e;
    }
};
struct polygon{
    int n;
    Point p[4];
    Line l[4];
    void add(Point q){
        p[n++]=q;
    }
    void getline(){
        for(int i=0;i<n;i++){
            l[i]=Line(p[i],p[(i+1)%n]);
        }
    }
    double getarea(){
        double sum=0;
        for(int i=0;i<n;i++){
            sum+=(p[i]^p[(i+1)%n]);
        }
        return fabs(sum)/2;
    }
};
int main()
{
    scanf("%d",&x);
    while(x!=-1){
        double area;
        scanf(" %d",&y);
        scanf("%d %d",&x2,&y2);
        scanf("%d %d",&x3,&y3);
        ll cnt1=__gcd(abs((x2-x)),abs(y2-y))+1;//ab
        ll cnt2=__gcd(abs(x2-x3),abs(y2-y3))+1;//bc
        ll cnt3=__gcd(abs(x-x3),abs(y-y3))+1;//ac
        ll cnt4=0;//内部
        Point p1(x,y);
        Point p2(x2,y2);
        Point p3(x3,y3);
        polygon pp;
        pp.n=3;
        pp.p[0]=p1;
        pp.p[1]=p2;
        pp.p[2]=p3;
        area=pp.getarea();
        cnt4=(ll)(area+1-(cnt1+cnt2+cnt3-3.0)/2.0);
        printf("%.1lf %lld %lld %lld %lld\n",area,cnt4,cnt1-2,cnt2-2,cnt3-2);//需要减去每条线段的两个端点
        scanf("%d",&x);
    }
    return 0;
}