Pagini recente » Cod sursa (job #1053971) | Cod sursa (job #2437520) | Cod sursa (job #275984) | Monitorul de evaluare | Cod sursa (job #593997)
Cod sursa(job #593997)
# 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, 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 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) ;
}
}