Cod sursa(job #1405584)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 29 martie 2015 13:51:12
Problema Overlap Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <cstdio>
#include <queue>
#include <unordered_map>
#define Nmax 805
#define mp make_pair

using namespace std;

struct Point
{
    int x,y;
} a[Nmax];

const int sin[]={0,1, 0,-1};
const int cos[]={1,0,-1, 0};
unordered_map < long long , int > M;
int sol[Nmax],n,cuplez[Nmax];
bool viz[Nmax],used[Nmax];
queue <int> Q;

inline bool Solve(int rot, int dx, int dy)
{
    int i;
    for(i=1;i<=n;++i) viz[i]=used[i]=false;
    for(i=1;i<=n;++i)
    {
        Point P;
        P.x=a[i].x*cos[rot]-a[i].y*sin[rot]+dx;
        P.y=a[i].x*sin[rot]+a[i].y*cos[rot]+dy;
        if(M[1LL*P.x*1000000+P.y])
        {
            cuplez[i]=M[1LL*P.x*1000000+P.y];
            viz[cuplez[i]]=true;
        }
    }
    for(i=1;i<=n;++i)
        if(!viz[i])
        {
            Q.push(i);
            used[i]=true;
        }
    int nr=0;
    while(!Q.empty())
    {
        int nod=Q.front(); Q.pop();
        if(!cuplez[nod]) continue;
        used[nod]=true; used[cuplez[nod]]=true;
        sol[nod]=1; sol[cuplez[nod]]=2; ++nr;
        if(cuplez[cuplez[nod]] && !used[cuplez[cuplez[nod]]])
        {
            Q.push(cuplez[cuplez[nod]]);
            used[cuplez[cuplez[nod]]]=true;
        }
    }
    return (nr==n/2);
}

int main()
{
    int i,t;
    freopen ("overlap.in","r",stdin);
    freopen ("overlap.out","w",stdout);
    scanf("%d", &n);
    for(i=1;i<=n;++i)
    {
        scanf("%d%d", &a[i].x,&a[i].y);
        M[1LL*a[i].x*1000000+a[i].y]=i;
    }
    for(t=0;t<4;++t)
    {
        Point P;
        P.x=a[1].x*cos[t]-a[1].y*sin[t];
        P.y=a[1].x*sin[t]+a[1].y*cos[t];
        for(i=2;i<=n;++i)
        {
            int xx=a[i].x-P.x,yy=a[i].y-P.y;
            if(Solve(t,xx,yy))
            {
                for(i=1;i<=n;++i) printf("%d\n", sol[i]);
                return 0;
            }
        }
    }
    return 0;
}