Cod sursa(job #2602276)

Utilizator alexradu04Radu Alexandru alexradu04 Data 16 aprilie 2020 15:25:27
Problema Overlap Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.84 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;
            for (int j = 1; j <= n; ++j) {
                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;
}