Pagini recente » Cod sursa (job #2226967) | Cod sursa (job #2196259) | Cod sursa (job #1922503) | Cod sursa (job #552807) | Cod sursa (job #2010290)
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 800;
const int ROT = 4;
typedef pair <int, int> PII;
map <PII, int> pts[4];
PII v[4][MAXN + 1];
int rx[] = {1, 1, -1, -1}, ry[] = {1, -1, -1, 1};
int group[MAXN + 1], prv[MAXN + 1], nxt[MAXN + 1];
int main()
{
ifstream fin("overlap.in");
ofstream fout("overlap.out");
int n, x, y;
bool sol_found = false;
fin >> n;
for (int i = 1; i <= n; ++i) {
fin >> x >> y;
for (int r = 0; r < ROT; ++r) {
v[r][i] = make_pair(x * rx[r], y * ry[r]);
swap(x, y);
pts[r].insert(make_pair(v[r][i], i));
}
}
for (int r = 0; r < ROT && !sol_found; ++r)
for (int fix = 2; fix <= n && !sol_found; ++fix) {
PII trans = make_pair(v[r][fix].first - v[0][1].first, v[r][fix].second - v[0][1].second);
memset(group, 0, sizeof group);
memset(prv, 0, sizeof prv);
memset(nxt, 0, sizeof nxt);
nxt[1] = fix; prv[fix] = 1;
bool possible = true;
for (int i = 2; i <= n; ++i) {
PII tp = make_pair(v[0][i].first + trans.first, v[0][i].second + trans.second);
if (pts[r].count(tp)) {
if (pts[r][tp] == i)
possible = false;
nxt[i] = pts[r][tp];
prv[pts[r][tp]] = i;
}
}
if (possible) {
for (int i = 1; i <= n && possible; ++i)
if (group[i] == 0) {
int p = i;
while (prv[p] != i && prv[p])
p = prv[p];
group[p] = 1;
while (nxt[p] && group[nxt[p]] == 0) {
group[nxt[p]] = 3 - group[p];
p = nxt[p];
}
if (group[p] == 1)
possible = false;
}
sol_found |= possible;
}
}
for (int i = 1; i <= n; ++i)
fout << group[i] << '\n';
fin.close();
fout.close();
return 0;
}