Cod sursa(job #594007)

Utilizator cont_de_testeCont Teste cont_de_teste Data 5 iunie 2011 20:17:18
Problema Overlap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.32 kb
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;

#define NMAX 810
#define MP make_pair
#define x first
#define y second

int N, stepmax;

pair<pair <int, int>, int> a[NMAX];
pair <int, int> b[NMAX];

int ov[NMAX];
char ck[NMAX];
char viz[NMAX];
int SOL[NMAX];
typedef pair <int, int> PR ;
void rot1(pair <int, int> a[])
{
	int i;

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

inline int srch1(pair <int, int> val)
{
	int step = stepmax, x = 0;

	for (; step; step >>= 1)
		if (x + step <= N && a[x + step].x <= val)
			x += step;

	if (a[x].x == val) return x;

	return 0;
}

int srch (pair <int, int> see) {
    int i, cnt ;
    for (cnt = stepmax, 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_sol()
{
	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()
{
	int i, t, dx, dy, j, e = 0;

	freopen("overlap.in", "r", stdin);
	freopen("overlap.out", "w", stdout);

	scanf("%d", &N);

	for (stepmax = 1; stepmax << 1 <= N; stepmax <<= 1);

	for (i = 1; i <= N; i++) {
		scanf("%d %d", &a[i].x.x, &a[i].x.y);
		a[i].y = i;
	}

	sort(a + 1, a + N + 1);

	for (i = 1; i <= N; i++) b[i] = a[i].x;

	for (t = 0; t < 4; rot(b), t++) {
		for (i = 1; i <= N; i++) {
			dx = a[i].x.x - b[1].x; dy = a[i].x.y - b[1].y;
			if (dx == 0 && dy == 0) continue;

			memset(ck, 0, sizeof(ck));
			for (j = 1; j <= N; j++) ck[ ov[j] = srch(MP(b[j].x + dx, b[j].y + dy)) ] = 1;

			e = get_sol();

			if (e) break;
		}
		if (e) break;


	}

	for (i = 1; i <= N; i++) printf("%d\n", SOL[i] + 1);

return 0;
}