Nu aveti permisiuni pentru a descarca fisierul grader_test8.in

Cod sursa(job #206845)

Utilizator CezarMocanCezar Mocan CezarMocan Data 10 septembrie 2008 00:52:20
Problema Overlap Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.35 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;

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=2;i<=n;i++)
    {
    nou.x=v[1].x;
	nou.y=v[1].y;
    for (k=0;k<=3;k++)
        {
//		printf("%d %d\n",nou.x,nou.y);
        shx=v[i].x-nou.x;
        shy=v[i].y-nou.y;
//		printf("%d %d\n",shx,shy);
//		printf("\n");
        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);
//			printf("%d\n",poz);
			if (poz!=0&&viz[poz]==0)
				{
				rez[v[j].poz]=v[poz].poz;
				viz[poz]=1;
				}
			}
		memset(sol,0,sizeof(sol));
		unu=0;
		for (j=1;j<=n;j++)
			if (rez[j])
				{
				sol[j]=1;
				sol[rez[j]]=2;
				}
		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;
        }    
    }
while (1)
{

}
return 0;
}