Pagini recente » Cod sursa (job #2478972) | Cod sursa (job #827160) | Cod sursa (job #532159) | Cod sursa (job #1657736) | Cod sursa (job #1159468)
#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";
}