Cod sursa(job #960622)

Utilizator primulDarie Sergiu primul Data 10 iunie 2013 20:26:34
Problema Overlap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.32 kb
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <string.h>
using namespace std;
  
#define NMAX 810
#define MP make_pair
#define x first
#define y second
  
int N, stepmax;
  
pair<pair <int, int>, int> a[NMAX];
pair <int, int> b[NMAX];
  
int leg[NMAX];
char bun[NMAX];
char viz[NMAX];
int rez[NMAX];
  
void rot(pair <int, int> a[])
{
    int i;
  
    for (i = 1; i <= N; i++) {
        swap(a[i].x, a[i].y);
        a[i].x = -a[i].x;
    }
}
  
inline int srch(pair <int, int> val)
{
    int step = stepmax, x = 0;
  
    for (; step; step >>= 1)
        if (x + step <= N && a[x + step].x <= val)
            x += step;
  
    if (a[x].x == val) return x;
  
    return 0;
}
  
int get_sol()
{
    int j, q, beg, e, nr;
  
    memset(viz, 0, sizeof(viz));
  
    for (j = 1, e = 1; j <= N && e; j++) {
        if (bun[j]) continue;
  
        for (nr = 1, q = j; ; nr++, q = leg[q]) {
            viz[q] = 1;
            rez[a[q].y] = nr & 1;
            if (!leg[q]) break;
        }
  
        if (nr & 1) e = 0;
    }
    for (j = 1; j <= N && e; j++) {
        if (viz[j]) continue;
  
        for (nr = 1, q = beg = j; ; nr++, q = leg[q]) {
            if (!q) exit(0);
            viz[q] = 1;
            rez[a[q].y] = nr & 1;
            if (leg[q] == beg) break;
        }
  
        if (nr & 1) e = 0;
    }
  
    return e;
}
  
  
int main()
{
    int i, t, dx, dy, j, e = 0;
  
    freopen("overlap.in", "r", stdin);
    freopen("overlap.out", "w", stdout);
  
    scanf("%d", &N);
  
    for (stepmax = 1; stepmax <= N; stepmax <<= 1);
  
    for (i = 1; i <= N; i++) {
        scanf("%d %d", &a[i].x.x, &a[i].x.y);
        a[i].y = i;
    }
  
    sort(a + 1, a + N + 1);
  
    for (i = 1; i <= N; i++) b[i] = a[i].x;
  
    for (t = 0; t < 4; t++) {
        for (i = 1; i <= N; i++) {
            dx = a[i].x.x - b[1].x; dy = a[i].x.y - b[1].y;
            if (dx == 0 && dy == 0) continue;
  
            memset(bun, 0, sizeof(bun));
            for (j = 1; j <= N; j++) bun[ leg[j] = srch(MP(b[j].x + dx, b[j].y + dy)) ] = 1;
  
            e = get_sol();
  
            if (e) break;
        }
        if (e) break;
  
        rot(b);
    }
  
    for (i = 1; i <= N; i++) printf("%d\n", rez[i] + 1);
  
return 0;
}