Pagini recente » Cod sursa (job #2027343) | Cod sursa (job #241164) | Cod sursa (job #1926650) | Cod sursa (job #1464499) | Cod sursa (job #1159459)
#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";
}