Cod sursa(job #594023)

Utilizator SpiderManSimoiu Robert SpiderMan Data 5 iunie 2011 22:15:13
Problema Overlap Scor 24
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.25 kb
# include <algorithm>
# include <cstdio>
# include <cstring>
using namespace std ;

typedef pair <int, int> PR ;
const char *FIN = "overlap.in", *FOU = "overlap.out" ;
const int MAX = 805 ;

# define x first
# define y second

pair <PR, int> A[MAX] ;
PR B[MAX] ;
int SOL[MAX], ov[MAX] ;
bool VIZ[MAX], ck[MAX] ;
int N, aux, sol ;

void rotate (PR *X) {
    for (int i = 1; i <= N; ++i) {
        swap (X[i].x, X[i].y) ;
        X[i].x *= -1 ;
    }
}

int cb (PR see) {
    int i, cnt ;
    for (cnt = aux, i = 0; cnt ; cnt >>= 1) {
        if (i + cnt <= N && A[i + cnt].x <= see) {
            i += cnt ;
        }
    }
    return (A[i].x == see ? i : 0) ;
}

int get (void) {
    memset (VIZ, 0, sizeof (VIZ)) ;
    for (int i = 1; i <= N; ++i) {
        if (ck[i] == 0) {
            int X = 1 ;
            for (int j = i;  ; X ^= 1, j = ov[j]) {
                VIZ[j] = 1, SOL[A[j].y] = X;
                if (ov[j] == 0) break ;
            }
            if (X) return 0;
        }
    }
    for (int i = 1; i <= N; ++i) {
        if (VIZ[i] == 0) {
            int X = 1 ;
            for (int j = i; ; X ^= 1, j = ov[j]) {
                if (j == 0) return 0;
                VIZ[j] = 1, SOL[A[j].y] = X ;
                if (ov[j] == j) break ;
            }
            if (X) return 0;
        }
    }
    return 1;
}

int main (void) {
    freopen (FIN, "r", stdin) ;
    freopen (FOU, "w", stdout) ;

    scanf ("%d", &N) ;
    for (int i = 1; i <= N; ++i) {
        scanf ("%d %d", &A[i].x.x, &A[i].x.y), A[i].y = i;
    }
    for (aux = 1; aux << 1 <= N; aux <<= 1) ;
    sort (A + 1, A + N + 1) ;
    for (int i = 1; i <= N; ++i) {
        B[i] = A[i].x ;
    }
    for (int k = 0; k < 4; rotate (B), ++k) {
        for (int i = 1; i <= N; ++i) {
            PR D (A[i].x.x - B[1].x, A[i].x.y - B[1].y) ;
            if (D.x == 0 && D.y == 0) continue ;
            memset (ck, 0, sizeof (ck)) ;
            for (int j = 1; j <= N; ++j) {
                ck[ ov[j] = cb (make_pair (B[j].x + D.x, B[j].y + D.y)) ] = 1 ;
            }

            if ((sol = get())) break ;
        }
        if (sol) break ;
    }
    for (int i = 1; i <= N; ++i) {
        printf ("%d\n", SOL[i] + 1) ;
    }
}