Pagini recente » Cod sursa (job #1251579) | Cod sursa (job #3256882) | Cod sursa (job #2862811) | Cod sursa (job #3176103) | Cod sursa (job #594035)
Cod sursa(job #594035)
# 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) ;
}
}