Cod sursa(job #1366022)

Utilizator vladrochianVlad Rochian vladrochian Data 28 februarie 2015 17:56:26
Problema Overlap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#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;
}