Cod sursa(job #1159459)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 29 martie 2014 17:01:44
Problema Overlap Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.51 kb
#include <fstream>
#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;
}v[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>>v[i].x>>v[i].y;
    }

    for (int i=1; i<=n; ++i)
    {
        for (int k=0; k<4; ++k)
        {
            point a = Rotate (v[i],k);

            for (int j=1; j<=n; ++j)
            {
                if (j == i)
                    continue;
                point b = v[j];

                int h = 1LL*(a.x-b.x)*(a.y-b.y)%mod;
                if (h < 0)
                    h += mod;
                bool ok = 0;

                for (vint it = H[k][h].begin (); it != H[k][h].end(); ++it)
                {
                    point c = v[it->i], d = v[it->j];

                    c = Rotate (c,k);

                    if ( a.x - b.x == c.x - d.x && a.y - b.y == c.y - d.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";
}