Cod sursa(job #415430)

Utilizator freak93Adrian Budau freak93 Data 11 martie 2010 12:42:10
Problema Poligon Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include<fstream>
#include<algorithm>
#include<vector>

using namespace std;

const char iname[]="poligon.in";
const char oname[]="poligon.out";
const int maxn=1605;

ifstream f(iname);
ofstream g(oname);

struct point
{
    int x;
    int y;
    point(int _x,int _y):x(_x),y(_y){}
    point():x(0),y(0){}
} a[maxn],b[maxn];

ifstream& operator>>(ifstream &a,point &b)
{
    a>>b.x;
    a>>b.y;
    return a;
}

bool operator<(const point& a,const point& b)
{
    if(a.x==b.x)
        return a.y<b.y;
    return a.x<b.x;
}

struct line
{
    point a;
    point b;
    line(point _a,point _b):a(_a),b(_b){}
    line(int _ax,int _ay,int _bx,int _by):a(_ax,_ay),b(_bx,_by){}
};

long long area(point a,point b,point c)
{
    return 1LL*a.x*(b.y-c.y)+1LL*b.x*(c.y-a.y)+1LL*c.x*(a.y-b.y);
}

vector<line> E[maxn];

bool operator<(const line &a,const line& b)
{
    if((area(a.a,a.b,b.a)>=0)^(area(a.a,a.b,b.b)>=0))
        return area(b.a,b.b,a.a)<0;
    return area(a.a,a.b,b.a)>=0;
}

int i,j,n,m,x,y;

int main()
{
    //read&sort
    f>>n>>m;
    for(i=1;i<=n;++i)
        f>>a[i],b[i]=a[i];
    sort(b+1,b+n+1);
    b[0].x=-1;
    b[n+1].x=70000;
    //benzi
    a[0]=a[n];
    for(i=0;i<n;++i)
        if(a[i].x!=a[i+1].x)
            for(j=1;j<=n;++j)
                if((a[i].x<=b[j].x&&a[i+1].x>=b[j+1].x)||(a[i+1].x<=b[j].x&&a[i].x>=b[j+1].x))
                    E[j].push_back(line(min(a[i],a[i+1]),max(a[i],a[i+1])));

    for(i=0;i<=n;++i)
        E[i].push_back(line(-1,-1,70000,-1));
    for(i=0;i<=n;++i)
        sort(E[i].begin(),E[i].end());

    f.close();
    g.close();

    return 0;
}