Cod sursa(job #206926)

Utilizator CezarMocanCezar Mocan CezarMocan Data 11 septembrie 2008 00:06:55
Problema Overlap Scor 4
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.08 kb
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

struct punct{int x; int y;};

struct marmota{int x; int y; int poz;};

punct vt[810],nou,nn,aux;
marmota v[810];
int n,i,j,k,shx,shy,kk,viz[810],rez[810],ok,sol[810],unu,doi,poz,as,lung,p;	

bool mai_mic(marmota a, marmota b)
    {
    if ((a.x<b.x)||((a.x==b.x)&&(a.y<b.y)))
        return true;
    return false;   
    }

bool cmp(marmota a, marmota b)
    {
    if (mai_mic(a,b))
        return true;
    return false;    
    }

int caut_bin(punct x, long l, long r)
{
	long m=(l+r)/2;
	if ((x.x==v[m].x)&&(x.y==v[m].y))
		return m;
	if (l>=r)
		return 0;
	if ((x.x<v[m].x)||((x.x==v[m].x)&&(x.y<v[m].y)))
		return caut_bin(x,l,m-1);
	else
		return caut_bin(x,m+1,r);

}

int main(){
freopen("overlap.in","r",stdin);
freopen("overlap.out","w",stdout);
scanf("%d",&n);
for (i=1;i<=n;i++)
	{
    scanf("%d%d",&v[i].x,&v[i].y);
	v[i].poz=i;
	}
sort(v+1,v+n+1,cmp);
for (i=1;i<=n;i++)
    {
//	printf("\n\n%d\n\n",i);
    nou.x=v[1].x;
	nou.y=v[1].y;
    for (k=0;k<=333;k++)
        {
        shx=v[i].x-nou.x;
        shy=v[i].y-nou.y;
        memset(vt,0,sizeof(vt));
        for (j=1;j<=n;j++)
            {
            nn.x=v[j].x;
			nn.y=v[j].y;
            aux=nn;
            for (kk=1;kk<=k;kk++)    
                {
                nn.x=aux.y;
                nn.y=-aux.x;
                aux=nn;
                }
            vt[j].x=nn.x+shx;
            vt[j].y=nn.y+shy;
            }    
		memset(viz,0,sizeof(viz));
		memset(rez,0,sizeof(rez));
//		for (j=1;j<=n;j++)
//			printf("%d %d\n",vt[j].x,vt[j].y);
//		printf("\n");
		ok=1;
		for (j=1;j<=n;j++)
			{
			poz=caut_bin(vt[j],1,n);
			if (poz==j)
				{
				if (v[j+1].x==v[j].x&&v[j+1].y==v[j].y&&j<n)
					poz=j+1;
				if (v[j-1].x==v[j].x&&v[j-1].y==v[j].y&&j>0)
					poz=j-1;
				}
//			printf("%d\n",poz);
			if (poz!=0&&viz[poz]==0)
				{
				rez[v[j].poz]=v[poz].poz;
				viz[poz]=1;
				}
			}
//		for (j=1;j<=n;j++)
//			printf("%d ",rez[j]);
//		printf("\n");	
		as=1;
		memset(viz,0,sizeof(viz));
		for (j=1;j<=n;j++)
			if (rez[j]&&viz[j]==0)
				{
//				viz[j]=1;
				p=j;
				lung=0;
				while (p&&viz[p]==0)
					{
					lung++;
					viz[p]=1;
					p=rez[p];
					}
//				printf("%d\n",lung);
				if (lung%2)
					{
//					as=0;
//					break;
					}
				}
		memset(sol,0,sizeof(sol));
//		return 0;
		if (as)
			{
			memset(viz,0,sizeof(viz));
			for (j=1;j<=n;j++)
				{
				if (rez[j]&&viz[j]==0)
					{
//					viz[j]=1;
					p=j;
					lung=0;
					while (p&&viz[p]==0)
						{
						lung++;
						viz[p]=1;					
						if (lung%2==1)
							sol[p]=1;
						else
							sol[p]=2;
						p=rez[p];
						}
					}
				}
			}
		unu=doi=0;
		for (j=1;j<=n;j++)
			{
			if (sol[j]==1)
				unu++;
			if (sol[j]==2)
				doi++;
			}
		if ((unu==doi)&&(unu==(n/2)))
			//am solutie
			{
			for (i=1;i<=n;i++)
				printf("%d\n",sol[i]);
			return 0;
			}
		aux=nou;
		nou.x=aux.y;
		nou.y=-aux.x;
        }    
    }
return 0;
}