Cod sursa(job #2580842)

Utilizator david.teacaDavid Stefan Teaca david.teaca Data 14 martie 2020 11:34:56
Problema Overlap Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <bits/stdc++.h>
using namespace std;
 
const int DIM = 805;
 
map<pair<int, int>, int> mmp;
 
int nxt[DIM], prv[DIM], ans[DIM], mrk[DIM];
pair<int, int> pts[DIM], aux[DIM];
 
int main(void) {
	freopen("overlap.in", "r", stdin);
	freopen("overlap.out", "w", stdout);
	int n; cin >> n;
	for (int i = 1; i <= n; ++i) {
		cin >> pts[i].first >> pts[i].second;
		mmp[pts[i]] = i; aux[i] = pts[i];
	}
	for (int t = 1; t <= 4; ++t) {
		for (int i = 1; i <= n; ++i) {
			swap(aux[i].first, aux[i].second);
			aux[i].first *= -1;
		}
		for (int i = 2; i <= n; ++i) {
			int dx = pts[i].first - aux[1].first,
					dy = pts[i].second - aux[1].second;
			for (int j = 1; j <= n; ++j) {
				nxt[j] = prv[j] = mrk[j] = 0;
				pair<int, int> pt = make_pair(aux[j].first + dx, aux[j].second + dy);
				auto it = mmp.find(pt);
				if (it != mmp.end()) {
					nxt[j] = it -> second; 
					prv[it -> second] = j;
				}
			}
			bool ok = true;
			for (int j = 1; j <= n; ++j) if (!mrk[j]) {
				int x = j;
				while (prv[x] and prv[x] != j)
					x = prv[x];
				int sd = 1, nr = 0;
				while (x and !mrk[x]) {
					ans[x] = sd; sd = 3 - sd; ++nr; 
					mrk[x] = true; x = nxt[x];
				}
				if (nr % 2) {
					ok = false; 
					break;
				}
			}
			if (ok) {
				for (int j = 1; j <= n; ++j)
					cout << ans[j] << "\n";
				return 0;
			}
		}
	}
	return 0;
}