Cod sursa(job #2216381)

Utilizator NOSCOPEPROKENDYMACHEAMACUMVREAU NOSCOPEPROKENDY Data 26 iunie 2018 15:33:26
Problema Overlap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <bits/stdc++.h>
 
using namespace std;
 
const int MAX_N = 800;
pair<int, int> v[MAX_N + 5], c[MAX_N + 5];
map<pair<int, int>, int>mp;
 
int prv[MAX_N + 5], nxt[MAX_N + 5];
int ans[MAX_N + 5];
 
int main() {
  freopen("overlap.in", "r", stdin);
  freopen("overlap.out", "w", stdout);
 
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) {
    int x, y;
    scanf("%d%d", &x, &y);
    v[i] = c[i] = {x, y};
    mp[v[i]] = i;
  }
  for (int rot = 0; rot < 4; ++rot) {
    for (int i = 1; i <= n; ++i) {
      swap(v[i].first, v[i].second);
      v[i].second *= -1;
    }
    for (int i = 2; i <= n; ++i) {
      memset(nxt, 0, sizeof(nxt));
      memset(prv, 0, sizeof(prv));
      memset(ans, 0, sizeof(ans));
      int dx = c[i].first - v[1].first;
      int dy = c[i].second - v[1].second;
      for (int j = 1; j <= n; ++j) {
        if (i != j && mp.count({v[j].first + dx, v[j].second + dy}) != 0) {
          int aux = mp[{v[j].first + dx, v[j].second + dy}];
          nxt[j] = aux;
          prv[aux] = j;
        }
      }
      bool ok = 1;
      for (int j = 1; j <= n; ++j) {
        int aux = j;
        while (prv[aux] != 0 && prv[aux] != j)
          aux = prv[aux];
        int l = 0;
        while (ans[aux] == 0 && aux != 0) {
          ans[aux] = l % 2 + 1;
          l++;
          aux = nxt[aux];
        }
        if (l % 2 == 1) {
          ok = 0;
          break;
        }
      }
      if (ok == 1) {
        for (int j = 1; j <= n; ++j)
          printf("%d\n", ans[j]);
        return 0;
      }
    }
  }
 
  return 0;
}