Pagini recente » Cod sursa (job #103512) | Cod sursa (job #2123163) | Cod sursa (job #1182419) | Cod sursa (job #3247174) | Cod sursa (job #1507150)
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxN 802
using namespace std;
struct point
{
int x;
int y;
int pos;
}v[4][maxN];
int n, K, i, j, k, cx, cy, used[maxN], Next[maxN], Prev[maxN];
int cmp(const point a, const point b)
{
if (a.x == b.x)
return a.y < b.y;
return a.x < b.x;
}
int bs(int k, int x, int y)
{
int i = 0, p = 1 << 9;
while (p)
{
if (i + p <= n && v[k][i + p].x < x || (v[k][i + p].x == x && v[k][i + p].y <= y))
i += p;
p /= 2;
}
}
void read()
{
freopen("overlap.in", "r", stdin);
scanf("%d", &n);
for (i = 1; i <= n; ++ i)
scanf("%d %d", &v[0][i].x, &v[0][i].y);
}
void solve()
{
int shift_x, shift_y, pos;
for (i = 1; i <= n; ++ i)
{
int x = v[0][i].x;
int y = v[0][i].y;
v[1][i].x = y;
v[1][i].y = -x;
v[2][i].x = -x;
v[2][i].y = -y;
v[3][i].x = -y;
v[3][i].y = x;
v[1][i].pos = v[2][i].pos = v[3][i].pos = v[0][i].pos = i;
}
sort(v[0] + 1, v[0] + n + 1, cmp);
for (k = 0; k < 4; ++ k)
{
for (i = 2; i <= n; ++ i)
{
shift_x = v[0][1].x - v[k][i].x;
shift_y = v[0][1].y - v[k][i].y;
Next[v[0][1].pos] = v[k][i].pos;
for (j = 2; j <= n; ++ j)
{
cx = shift_x + v[k][j].x;
cy = shift_y + v[k][j].y;
pos = bs(0, cx, cy);
if (pos == 0 || j == pos)
Next[v[k][j].pos] = -1;
else
{
Prev[v[k][pos].pos] = v[k][j].pos;
Next[v[k][j].pos] = v[k][pos].pos;
}
}
memset(used, 0, sizeof(used));
K = k;
k = 1;
int nr = 0;
bool ok = 1;
for (j = 1; j <= n; ++ j)
if (!used[j])
{
nr += 2;
if (Next[j] == -1 || used[Next[j]])
{
ok = 0;
break;
}
used[j] = k;
used[Next[j]] = 3 - k;
k = 3 - k;
}
k = K;
if (nr == n)
k = 4;
}
}
}
void write()
{
freopen("overlap.out", "w", stdout);
for (i = 1; i <= n; ++ i)
printf("%d\n", used[i]);
}
int main()
{
read();
solve();
write();
return 0;
}