Pagini recente » Cod sursa (job #1494475) | Cod sursa (job #1950698) | Cod sursa (job #2727982) | Cod sursa (job #288012) | Cod sursa (job #1366022)
#include <fstream>
#include <map>
#include <cstring>
using namespace std;
typedef pair<int, int> Pair;
const int kMaxN = 805;
ifstream fin("overlap.in");
ofstream fout("overlap.out");
int N;
Pair p[4][kMaxN];
map<Pair, int> mp[4];
int nxt[kMaxN], prv[kMaxN], part[kMaxN];
inline void Link(int a, int b) {
nxt[a] = b;
prv[b] = a;
}
int main() {
fin >> N;
for (int i = 1; i <= N; ++i) {
int x, y;
fin >> x >> y;
p[0][i] = Pair(x, y);
p[1][i] = Pair(y, -x);
p[2][i] = Pair(-x, -y);
p[3][i] = Pair(-y, x);
mp[0].insert(make_pair(Pair(x, y), i));
mp[1].insert(make_pair(Pair(y, -x), i));
mp[2].insert(make_pair(Pair(-x, -y), i));
mp[3].insert(make_pair(Pair(-y, x), i));
}
for (int rot = 0; rot < 4; ++rot)
for (int img = 2; img <= N; ++img) {
bool ok = true;
memset(nxt, 0, sizeof nxt);
memset(prv, 0, sizeof prv);
memset(part, 0, sizeof part);
Pair offset(p[rot][img].first - p[0][1].first, p[rot][img].second - p[0][1].second), nw;
Link(1, img);
for (int i = 2; i <= N; ++i) {
nw = Pair(p[0][i].first + offset.first, p[0][i].second + offset.second);
if (mp[rot].count(nw)) {
if (i == mp[rot][nw]) {
ok = false;
break;
}
Link(i, mp[rot][nw]);
}
}
if (!ok)
continue;
for (int i = 1; i <= N; ++i)
if (!part[i]) {
int crt = i;
while (prv[crt] && prv[crt] != i)
crt = prv[crt];
for (part[crt] = 1; nxt[crt] && !part[nxt[crt]]; crt = nxt[crt])
part[nxt[crt]] = 3 - part[crt];
if (part[crt] == 1) {
ok = false;
break;
}
}
if (ok) {
for (int i = 1; i <= N; ++i)
fout << part[i] << "\n";
return 0;
}
}
return 0;
}