Cod sursa(job #2010290)

Utilizator cella.florescuCella Florescu cella.florescu Data 12 august 2017 14:42:39
Problema Overlap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 800;
const int ROT = 4;
typedef pair <int, int> PII;

map <PII, int> pts[4];
PII v[4][MAXN + 1];
int rx[] = {1, 1, -1, -1}, ry[] = {1, -1, -1, 1};
int group[MAXN + 1], prv[MAXN + 1], nxt[MAXN + 1];

int main()
{
    ifstream fin("overlap.in");
    ofstream fout("overlap.out");
    int n, x, y;
    bool sol_found = false;
    fin >> n;
    for (int i = 1; i <= n; ++i) {
      fin >> x >> y;
      for (int r = 0; r < ROT; ++r) {
        v[r][i] = make_pair(x * rx[r], y * ry[r]);
        swap(x, y);
        pts[r].insert(make_pair(v[r][i], i));
      }
    }
    for (int r = 0; r < ROT && !sol_found; ++r)
      for (int fix = 2; fix <= n && !sol_found; ++fix) {
        PII trans = make_pair(v[r][fix].first - v[0][1].first, v[r][fix].second - v[0][1].second);
        memset(group, 0, sizeof group);
        memset(prv, 0, sizeof prv);
        memset(nxt, 0, sizeof nxt);
        nxt[1] = fix; prv[fix] = 1;
        bool possible = true;
        for (int i = 2; i <= n; ++i) {
          PII tp = make_pair(v[0][i].first + trans.first, v[0][i].second + trans.second);
          if (pts[r].count(tp)) {
            if (pts[r][tp] == i)
              possible = false;
            nxt[i] = pts[r][tp];
            prv[pts[r][tp]] = i;
          }
        }
        if (possible) {
          for (int i = 1; i <= n && possible; ++i)
            if (group[i] == 0) {
              int p = i;
              while (prv[p] != i && prv[p])
                p = prv[p];
              group[p] = 1;
              while (nxt[p] && group[nxt[p]] == 0) {
                group[nxt[p]] = 3 - group[p];
                p = nxt[p];
              }
              if (group[p] == 1)
                possible = false;
            }
          sol_found |= possible;
        }
      }
    for (int i = 1; i <= n; ++i)
      fout << group[i] << '\n';
    fin.close();
    fout.close();
    return 0;
}