Cod sursa(job #1559010)

Utilizator dobrebogdanDobre Bogdan Mihai dobrebogdan Data 29 decembrie 2015 21:40:00
Problema Aria Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include<cstdio>
#include<algorithm>
#include<cmath>
#define eps 1.e-14
using namespace std;
struct sp
{
    double x,y;
} ve[100005];
double ccw(sp a,sp b,sp c)
{
    return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
}
bool cmp(sp b,sp c)
{
    if(ccw(ve[1],b,c)>=eps)
    return 1;
    return 0;
}
double dist(sp p1,sp p2)
{
    return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
double arie(sp p1,sp p2,sp p3)
{
    double a,b,c,p;
    a=dist(p1,p2);
    b=dist(p2,p3);
    c=dist(p1,p3);
    p=(a+b+c)/2;
    return sqrt(p*(p-a)*(p-b)*(p-c));
}
int main()
{
    freopen("aria.in","r",stdin);
    freopen("aria.out","w",stdout);
    int n,i,j;
    double sum=0;
    sp o;
    o.x=0;
    o.y=0;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    scanf("%lf%lf",&ve[i].x,&ve[i].y);
    j=1;
    for(i=1;i<=n;i++)
    if(ve[i].x<ve[j].x || (ve[i].x==ve[j].x && ve[i].y<ve[j].y))
    j=i;
    swap(ve[1],ve[j]);
    sort(ve+2,ve+n+1,cmp);
    n++;
    ve[n]=ve[1];
    for(i=1;i<n;i++)
    {
        if(ccw(ve[i],ve[i+1],o)>=eps)
        sum=sum+arie(ve[i],ve[i+1],o);
        else
        sum=sum-arie(ve[i],ve[i+1],o);
    }
    if(sum<=-eps)
    sum=sum*-1;
    printf("%.5lf\n",sum);
    return 0;
}