Pagini recente » Borderou de evaluare (job #2019908) | Cod sursa (job #772832) | Cod sursa (job #1485052) | Cod sursa (job #2334555) | Cod sursa (job #191098)
Cod sursa(job #191098)
#include <stdio.h>
#include <vector>
#include <algorithm>
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 leg[NMAX];
char bun[NMAX];
int rez[NMAX];
void rot(pair <int, int> a[])
{
int i;
for (i = 1; i <= N; i++) {
swap(a[i].x, a[i].y);
a[i].x = -a[i].x;
}
}
inline int srch(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 main()
{
int i, t, dx, dy, j, nr, q, e = 0;
freopen("overlap.in", "r", stdin);
freopen("overlap.out", "w", stdout);
scanf("%d", &N);
for (stepmax = 1; stepmax <= N; stepmax <<= 1);
for (i = 1; i <= N; i++) {
scanf("%d %d", &a[i].x.x, &a[i].x.y);
a[i].y = i;
b[i] = a[i].x;
}
sort(a + 1, a + N + 1);
sort(b + 1, b + N + 1);
for (t = 0; t < 4; t++) {
for (i = 1; i <= N; i++) {
dx = a[i].x.x - b[1].x; dy = a[i].x.y - b[1].y;
if (t == 0 && dx == 0 && dy == 0) continue;
memset(bun, 0, sizeof(bun));
for (j = 1; j <= N; j++) bun[ leg[j] = srch(MP(b[j].x + dx, b[j].y + dy)) ] = 1;
for (j = 1, e = 1; j <= N && e; j++) {
if (bun[j]) continue;
for (nr = 1, q = j; leg[q]; nr++, q = leg[q]);
if (nr & 1) e = 0;
}
if (e) break;
}
if (e) break;
rot(b);
}
for (j = 1; j <= N; j++) {
if (bun[j]) continue;
for (nr = 1, q = j; leg[q]; nr++, q = leg[q])
rez[a[q].y] = nr & 1;
}
for (i = 1; i <= N; i++) printf("%d\n", rez[i] + 1);
return 0;
}