Cod sursa(job #594022)

Utilizator cont_de_testeCont Teste cont_de_teste Data 5 iunie 2011 22:06:41
Problema Overlap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.81 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 get1 (void) { // PROBLEMA
    memset (VIZ, 0, sizeof (VIZ)) ;
    for (int i = 1; i <= N; ++i) {
        if (ck[i] == 0) {
            int X = 1 ;
            for (int j = i; ; ++X, j = ov[j]) {
                VIZ[j] = 1, SOL[A[j].y] = X & 1;
                if (ov[j] == 0) break ;
            }
            if (X & 1) return 0;
        }
    }
    for (int i = 1; i <= N; ++i) {
        if (ck[i] == 0) {
            int X = 1 ;
            for (int j = i, k = i; ; ++X, j = ov[j]) {
                if (j == 0) return 0;
                VIZ[j] = 1, SOL[A[j].y] = X & 1;
                if (ov[j] == k) break ;
            }
            if (X & 1) return 0;
        }
    }
    return 1;
}
int get()
{
	int j, q, beg, e, nr;

	memset(VIZ, 0, sizeof(VIZ));

	for (j = 1; j <= N ; j++) {
		if (ck[j]) continue;

		for (nr = 1, q = j; ; nr++, q = ov[q]) {
			VIZ[q] = 1;
			SOL[A[q].y] = nr & 1;
			if (!ov[q]) break;
		}

		if (nr & 1) return 0 ;
	}

	for (j = 1; j <= N; j++) {
		if (VIZ[j]) continue;

		for (nr = 1, q = beg = j; ; nr++, q = ov[q]) {
			if (!q) return 0;
			VIZ[q] = 1;
			SOL[A[q].y] = nr & 1;
			if (ov[q] == beg) break;
		}

		if (nr & 1)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 ;
            }
            sol = get() ;
            if (sol) break ;
        }
        if (sol) break ;
    }
    for (int i = 1; i <= N; ++i) {
        printf ("%d\n", SOL[i] + 1) ;
    }
}