Cod sursa(job #1805712)

Utilizator dutzulBodnariuc Dan Alexandru dutzul Data 14 noiembrie 2016 02:09:44
Problema Aria Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.28 kb

#include <bits/stdc++.h>
namespace geometry{

double determinant(const std::vector<std::vector<double> > &a){
	double result=0;

	result+=a[0][0]*a[1][1]*a[2][2];
	result+=a[1][0]*a[2][1]*a[0][2];
	result+=a[2][0]*a[0][1]*a[1][2];

	result-=a[0][2]*a[1][1]*a[2][0];
	result-=a[1][2]*a[2][1]*a[0][0];
	result-=a[2][2]*a[0][1]*a[1][0];
	return result;
}

class Triangle{
public:
	Triangle(std::pair<double,double> p1,std::pair<double,double> p2,
			std::pair<double,double> p3){
		this->p1=p1;
		this->p2=p2;
		this->p3=p3;
	}
	double get_signed_area()  {
		std::vector<std::vector<double> > a(3,std::vector<double>(3,0));
		a[0][0]=a[1][0]=a[2][0]=1;
		a[0][1]=p1.first,a[0][2]=p1.second;
		a[1][1]=p2.first,a[1][2]=p2.second;
		a[2][1]=p3.first,a[2][2]=p3.second;
		return determinant(a);
	}
	std::pair<double,double> p1,p2,p3;
};


}

class Poligon{
public:
	Poligon(const std::vector<std::pair<double,double> >& points){
		this->points=std::vector<std::pair<double,double> > (points);
	}

	double get_area(){
	 	double area=0;
		for(int i=0;i<points.size();++i){
			geometry::Triangle T({0,0},points[i],points[(i+1)%points.size()]);
		  	area +=T.get_signed_area();
		}

		return area;
	}

	bool is_point_inside(std::pair<double,double> P){
		bool sign=sign_of_direction(points[0],points[1],P);
		for(int i=0,len=points.size();i<len;++i)
			if (sign_of_direction(points[i],points[(i+1)%len],P)!=sign){
				return false;
			}
		return true;
	}

	bool is_convex(){
		bool sign=sign_of_direction(points[0],points[1],points[2]);
		for(int i=0,len=points.size();i<len;++i)
			if (sign_of_direction(points[i],points[(i+1)%len],
									points[(i+2)%len])!=sign){
				return false;
			}
		return true;
	}


private:
	bool sign_of_direction(std::pair<double,double> p1,
			std::pair<double,double> p2,std::pair<double,double> p3){

		double area=(geometry::Triangle(p1,p2,p3)).get_signed_area();
		return area<0;
	}
	std::vector<std::pair<double,double> > points;
};

double mdl(double val){
	return val<0?-val:val;
}
#include <iomanip>
int main(){
	std::vector<std::pair<double,double> > A;
	std::ifstream f("aria.in");
	std::ofstream g("aria.out");
	int nrp;
	f>>nrp;


	while (nrp--){
		double x,y;
		f>>x>>y;
		A.push_back({x,y});
	}

	g<<std::fixed;
	g<<std::setprecision(7);

	Poligon poligon(A);
	g<<mdl(poligon.get_area()/2.0);

}