Cod sursa(job #830516)

Utilizator Robert29FMI Tilica Robert Robert29 Data 6 decembrie 2012 23:55:58
Problema Overlap Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include<stdio.h>
#include<algorithm>
using namespace std;
FILE*f=fopen("overlap.in","r");
FILE*g=fopen("overlap.out","w");
int n,x,y,xj,yj,a[802],nr,viz[802],sol[802];
struct punct
{
	int x,y,i;
}v[802],w[802];
int cmp(punct a,punct b)
{
	if(a.x==b.x)
		return a.y<b.y;
	return a.x<b.x;
}
int main()
{
	fscanf(f,"%d",&n);
	for(int i=1;i<=n;++i)
	{
		fscanf(f,"%d%d",&v[i].x,&v[i].y);
		v[i].i=w[i].i=i;
	}
	sort(v+1,v+n+1,cmp);
	for(int i=1;i<=n;++i)
		w[i]=v[i];
	int okk=1;
	for(int o=1;o<=4&&okk;++o)
	{
		for(int i=1;i<=n;++i)
		{
			int aux=w[i].x;
			w[i].x=w[i].y;
			w[i].y=-aux;
		}
		
		for(int i=2;i<=n;++i)
		{
			for(int j=1;j<=n;++j)
			{
				viz[j]=0;
				a[j]=0;
			}
			x=w[1].x-v[i].x;
			y=w[1].y-v[i].y;
			a[v[1].i]=v[i].i;
			for(int j=2;j<=n;++j)
			{
				xj=w[j].x-x;
				yj=w[j].y-y;
				int p=1;
				int u=n;
				while(p<=u)
				{
					int m=(p+u)/2;
					if(xj>v[m].x)
						p=m+1;
					else if(xj<v[m].x)
						u=m-1;
					else
						if(yj>v[m].y)
							p=m+1;
						else if(yj<v[m].y)
							u=m-1;
						else 
						{
							a[v[j].i]=v[m].i;
							break;
						}
				}
			}
			int ok=0;
			for(int j=1;j<=n;++j)
				if(a[j])
				{
					nr=1;
					viz[j]=1;
					int jj=j;
					while(a[jj]&&!viz[a[jj]])
					{
						jj=a[jj];
						++nr;
						viz[jj]=1;
					}
					if(nr%2)
					{
						ok=1;
						break;
					}
				}
			if(!ok)
				for(int j=1;j<=n;++j)
					if(!viz[j])
					{
						ok=1;
						break;
					}
			if(!ok)
			{
				for(int j=1;j<=n;++j)
					if(a[j])
					{
						sol[j]=1;;
						nr=1;
						int jj=j;
						while(a[jj])
						{
							jj=a[jj];
							++nr;
							if(nr%2)
								sol[jj]=1;
							else
								sol[jj]=2;;
						}
						
					}
				okk=0;
				break;
			}
			
		}
		
	}
	
	for(int i=1;i<=n;++i)
		fprintf(g,"%d\n",sol[i]);
	
	fclose(f);
	fclose(g);
	return 0;
}