Cod sursa(job #774113)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 3 august 2012 14:59:37
Problema Overlap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.35 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>

using namespace std;

#define maxn 880

int n;
int s[maxn], t[maxn];
char fol[maxn], isEnd[maxn];
pair<int, int> v[maxn];
pair<pair<int, int>, int> st[maxn];

int bs(pair<int, int> f)
{
    int left=1, med, right=n;
    while(left<=right)
    {
        med=(left+right)/2;
        if(st[med].first==f)
            return st[med].second;

        if(st[med].first<f)
            left=med+1;
        else
            right=med-1;
    }
    return 0;
}

int verif()
{
    int lg, x;
    for(int i=1; i<=n; ++i)
        if(isEnd[i]==0)
        {
            lg=0;
            x=i;
            while(x)
            {
                ++lg;
                s[x]=lg%2+1;
                fol[x]=1;
                x=t[x];
            }
            if(lg%2)
                return 0;
        }

    for(int i=1; i<=n; ++i)
        if(fol[i]==0)
        {
            lg=0;
            x=i;
            while(fol[x]==0)
            {
                ++lg;
                fol[x]=1;
                s[x]=lg%2+1;
                x=t[x];
            }
            if(lg%2)
                return 0;
        }
    return 1;
}


void solve()
{
    int x1=v[1].first, y1=v[1].second;
    int xs, ys, nc, wh;
    pair<int, int> p;

    for(int pas=0; pas<4; ++pas)
    {
        for(int i=1; i<=n; ++i)
        {
            if(pas==0 && i==1)
                continue;

            xs=v[i].first-x1;
            ys=v[i].second-y1;

            nc=0;
            memset(t, 0, sizeof(t));
            memset(fol, 0, sizeof(fol));
            memset(isEnd, 0, sizeof(isEnd));

            for(int j=1; j<=n; ++j)
            {
                p=make_pair(v[j].first-xs, v[j].second-ys);
                t[j]=bs(p);
                isEnd[t[j]]=1;
            }

            if(verif())
                return;
        }

        for(int i=1; i<=n; ++i)
        {
            xs=v[i].second;
            ys=-v[i].first;
            v[i].first=xs;
            v[i].second=ys;
        }
    }
}


int main()
{
    freopen("overlap.in", "r", stdin);
    freopen("overlap.out", "w", stdout);

    scanf("%d", &n);
    for(int i=1; i<=n; ++i)
    {
        scanf("%d%d", &v[i].first, &v[i].second);
        st[i]=make_pair(v[i], i);
    }

    sort(st+1, st+n+1);

    solve();

    for(int i=1; i<=n; ++i)
        printf("%d\n", s[i]);

    return 0;
}