Cod sursa(job #594035)

Utilizator SpiderManSimoiu Robert SpiderMan Data 5 iunie 2011 22:30:38
Problema Overlap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.26 kb
# include <algorithm>
# include <bitset>
# 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] ;
bitset <MAX> VIZ, ck ;
int N, aux, sol ;

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

int cb (PR see) { // caut binar
    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) {
    VIZ.reset () ;
    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] == i) 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) { // 4 rotatii
        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 ;
            ck.reset () ;
            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) ;
    }
}