Cod sursa(job #1507150)

Utilizator akaprosAna Kapros akapros Data 21 octombrie 2015 14:49:18
Problema Overlap Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.39 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxN 802
using namespace std;
struct point
{
    int x;
    int y;
    int pos;
}v[4][maxN];
int n, K, i, j, k, cx, cy, used[maxN], Next[maxN], Prev[maxN];
int cmp(const point a, const point b)
{
    if (a.x == b.x)
        return a.y < b.y;
    return a.x < b.x;
}
int bs(int k, int x, int y)
{
    int i = 0, p = 1 << 9;
    while (p)
    {
        if (i + p <= n && v[k][i + p].x < x || (v[k][i + p].x == x && v[k][i + p].y <= y))
            i += p;
        p /= 2;
    }
}
void read()
{
    freopen("overlap.in", "r", stdin);
    scanf("%d", &n);
    for (i = 1; i <= n; ++ i)
        scanf("%d %d", &v[0][i].x, &v[0][i].y);
}
void solve()
{
    int shift_x, shift_y, pos;
    for (i = 1; i <= n; ++ i)
    {
        int x = v[0][i].x;
        int y = v[0][i].y;
        v[1][i].x = y;
        v[1][i].y = -x;
        v[2][i].x = -x;
        v[2][i].y = -y;
        v[3][i].x = -y;
        v[3][i].y = x;
        v[1][i].pos = v[2][i].pos = v[3][i].pos = v[0][i].pos = i;
    }
     sort(v[0] + 1, v[0] + n + 1, cmp);
    for (k = 0; k < 4; ++ k)
    {
        for (i = 2; i <= n; ++ i)
        {
            shift_x = v[0][1].x - v[k][i].x;
            shift_y = v[0][1].y - v[k][i].y;
            Next[v[0][1].pos] = v[k][i].pos;
            for (j = 2; j <= n; ++ j)
            {
                cx = shift_x + v[k][j].x;
                cy = shift_y + v[k][j].y;
                pos = bs(0, cx, cy);
                if (pos == 0 || j == pos)
                   Next[v[k][j].pos] = -1;
                else
                {
                    Prev[v[k][pos].pos] = v[k][j].pos;
                    Next[v[k][j].pos] = v[k][pos].pos;
                }
            }


    memset(used, 0, sizeof(used));
    K = k;
    k = 1;
    int nr = 0;
    bool ok = 1;
    for (j = 1; j <= n; ++ j)
        if (!used[j])
    {
        nr += 2;
        if (Next[j] == -1 || used[Next[j]])
        {
            ok = 0;
            break;
        }
        used[j] = k;
        used[Next[j]] = 3 - k;
        k = 3 - k;
    }
    k = K;
    if (nr == n)
        k = 4;
        }
    }
}
void write()
{
    freopen("overlap.out", "w", stdout);
    for (i = 1; i <= n; ++ i)
        printf("%d\n", used[i]);
}
int main()
{
    read();
    solve();
    write();
    return 0;
}