Cod sursa(job #1159468)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 29 martie 2014 17:13:18
Problema Overlap Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.67 kb
#include <fstream>
#include <cstring>
#include <vector>

#define vint vector<Hash>::iterator
#define mod 666013

using namespace std;

ifstream fin ("overlap.in");
ofstream fout ("overlap.out");

int n;

struct point
{
    int x,y;
}r[4][801],from[801][801];

struct Hash
{
    short i,j;
    short nr;
};

vector<Hash> H[4][mod];
short side[801],wh1,wh2;
bool okk = 0;

point Rotate (point a, int k)
{
    if (k == 1)
        swap (a.x,a.y), a.x = -a.x;
    if (k == 2)
        a.x = -a.x, a.y = -a.y;
    if (k == 3)
        swap (a.x,a.y), a.y = -a.y;
    return a;
}

int main()
{
    fin>>n;

    for (int i=1; i<=n; ++i)
    {
        fin>>r[0][i].x>>r[0][i].y;
    }

    for (int k=1; k<4; ++k)
    {
        for (int i=1; i<=n; ++i)
        r[k][i].x = r[k-1][i].y,
        r[k][i].y = r[k-1][i].x,
        r[k][i].x = -r[k][i].x;
    }

    for (int k=0; k<4; ++k)
    {
        memset (from,0,sizeof(from));

        for (int i=1; i<=n; ++i)
        {
            for (int j=1; j<=n; ++j)
            {
                if (j == i)
                   continue;

                int h = 1LL*(r[k][i].x-r[0][j].x)*(r[k][i].y-r[0][j].y)%mod;
                if (h < 0)
                    h += mod;
                bool ok = 0;

                for (vint it = H[k][h].begin (); it != H[k][h].end(); ++it)
                {
                    if ( r[k][i].x - r[0][j].x == r[k][it->i].x - r[0][it->j].x && r[k][i].y - r[0][j].y == r[k][it->i].y - r[0][it->j].y )
                        {
                            from[i][j].x = it->i;
                            from[i][j].y = it->j;
                            it->i = i;
                            it->j = j;
                            it->nr++;

                            if (it->nr == n/2)
                                okk = 1;

                            ok = 1;
                            break;
                        }
                }

                if (okk)
                {
                    wh1 = i, wh2 = j;
                    break;
                }

                if (!ok)
                {
                    Hash A;
                    A.i = i;
                    A.j = j;
                    A.nr = 1;
                    H[k][h].push_back (A);
                }
            }

            if (okk)
                break;
        }

        if (okk)
            break;
    }

    while (wh1 !=0)
    {
        side[wh1] = 1;
        side[wh2] = 2;

        short temp = wh1;

        wh1 = from[wh1][wh2].x;
        wh2 = from[temp][wh2].y;
    }

    for (int i=1; i<=n; ++i)
        fout<<side[i]<<"\n";
}