Pagini recente » Cod sursa (job #426266) | Cod sursa (job #1892108) | Cod sursa (job #2479608) | Cod sursa (job #198527) | Cod sursa (job #2071688)
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <unordered_map>
FILE *fin = fopen("overlap.in", "r"), *fout = fopen("overlap.out", "w");
#define MAXN 800
#define MOD 7678098
#define T 283
long long plm;
int lista[MOD], urm[MAXN + 1], vala[MAXN + 1], valb[MAXN + 1], cine[MAXN + 1];
int x[MAXN + 1], y[MAXN + 1];
int n, ans[MAXN + 1], v[MAXN + 1];
bool viz[MAXN + 1], gr[MAXN + 1];
inline bool solve(int x) {
int cul = 1;
while (x) {
viz[x] = 1;
ans[x] = cul;
cul = 3 - cul;
x = v[x];
}
return (cul == 1);
}
inline bool ciclu(int x) {
int cul = 1;
while (viz[x] == 0) {
ans[x] = cul;
cul = 3 - cul;
viz[x] = 1;
x = v[x];
}
return (cul == 1);
}
inline void check() {
memset(gr, 0, sizeof gr);
for (int i = 1; i <= n; i++)
if (v[i])
gr[v[i]] = 1;
memset(ans, 0, sizeof ans);
memset(viz, 0, sizeof viz);
bool ok = 1;
for (int i = 1; i <= n; i++)
if (gr[i] == 0)
ok &= solve(i);
if (!ok) return ;
for (int i = 1; i <= n; i++)
if (viz[i] == 0)
ok &= ciclu(i);
if (!ok) return ;
for (int i = 1; i <= n; i++)
fprintf(fout, "%d\n", ans[i]);
exit(0);
}
inline void rot(int &a, int &b, int c) {
if (c >= 2) {
a = -a;
b = -b;
c -= 2;
}
if (c) {
a ^= b ^= a ^= b;
b = -b;
}
}
inline void adauga(int a, int b, int p) {
int r = (T * a + b) % MOD;
vala[++plm] = a;
valb[plm] = b;
cine[plm] = p;
urm[plm] = lista[r];
lista[r] = plm;
}
inline int cauta(int a, int b) {
int r = (T * a + b) % MOD;
if (r < 0 || r >= MOD) return 0;
int p = lista[r];
while (p && (vala[p] != a || valb[p] != b))
p = urm[p];
return cine[p];
}
int main() {
fscanf(fin, "%d", &n);
for (int i = 1; i <= n; i++) {
fscanf(fin, "%d%d", &x[i], &y[i]);
adauga(x[i], y[i], i);
}
for (int p = 0; p < 4; p++) {
int sa = x[1], sb = y[1];
rot(sa, sb, p);
for (int i = 2; i <= n; i++) {
int sx = x[i] - sa, sy = y[i] - sb;
v[1] = i;
int cnt = 1;
for (int j = 2; j <= n; j++) {
int a = x[j], b = y[j];
rot(a, b, p);
a += sx;
b += sy;
v[j] = cauta(a, b);
cnt += bool(v[j]);
}
if (cnt >= n / 2)
check();
}
}
return 1;
}