Cod sursa(job #822035)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 22 noiembrie 2012 21:08:56
Problema Overlap Scor 84
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <fstream>
#include <stdlib.h>
#include <algorithm>
#include <math.h>
#include <bitset>
using namespace std;

ifstream fi ("overlap.in");
ofstream fo ("overlap.out");

const short int dim = 802;
short int N, D, gata, D1[dim], D2[dim];
bitset <dim> viz, R;
struct coord { int x, y; short int i; } V[dim];

int cmp (coord a, coord b)
{
	if (a.x == b.x)
		return a.y < b.y;
	return a.x < b.x;
}

void cit ()
{
	int i, k;
	
	fi >> N;
	for (i = 1; i <= N; i++)
	{
		fi >> V[i].x >> V[i].y;
		V[i].i = i;
	}
	sort (V + 1, V + N + 1, cmp);
}

coord rot (coord c1, coord c2, coord c4)
{
	coord c3;
	c3.x = c2.x - c1.x;
	c3.y = c2.y - c1.y;
	switch (D)
	{
		case 0: c4.x +=  c3.x; c4.y +=  c3.y; break;
		case 1: c4.x += -c3.y; c4.y +=  c3.x; break;
		case 2: c4.x += -c3.x; c4.y += -c3.y; break;
		case 3: c4.x +=  c3.y; c4.y += -c3.x; break;
	}
	return c4;
}

int cauta (coord c1)
{
	int p = 1, u = N, m;
	while (p <= u)
	{
		m = (p + u) >> 1;
		if (c1.x == V[m].x)
		{
			if (c1.y == V[m].y)
				return m;
			if (c1.y > V[m].y)
				p = m + 1;
			else
				u = m - 1;
		}
		else 
		{
			if (c1.x > V[m].x)
				p = m + 1;
			else
				u = m - 1;
		}
	}
	return 0;
}

void back (int k)
{
	if (k - 1 == N >> 1)
	{
		gata = 1;
		for (int i = 1; i < k; i++)
		{
			R[V[D1[i]].i] = 1;
			R[V[D2[i]].i] = 0;
		}
		for (int i = 1; i <= N; i++)
			if (R[i] == 0)
				fo << 2 << '\n';
			else
				fo << 1 << '\n';
		return;
	}
	
	int i, j;
	coord c1 = V[D1[k - 1]], c2;
	coord c3 = V[D2[k - 1]], c4;
	
	for (i = 1; i <= N && gata == 0; i++)
	{
		if (viz[i])
			continue;
		
		c2 = V[i];
		c4 = rot (c1, c2, c3);
		if (j = cauta (c4))
		{
			if (viz[j])
				continue;
			
			viz[i] = 1;
			viz[j] = 1;
			
			D1[k] = i;
			D2[k] = j;
			back (k + 1);
			
			viz[i] = 0;
			viz[j] = 0;
		}
	}
}

void rez ()
{
	D1[1] = 1;	
	viz[1] = 1;
	for (int i = 2; i <= N; i++)
	{
		D2[1] = i;
		
		viz[i] = 1;
		for (D = 0; D < 4; D++)
			back (2);
		viz[i] = 0;
	}
}

int main ()
{
	cit ();
	rez ();
	return 0;
}