Cod sursa(job #829892)

Utilizator BarracudaFMI-Alex Dobrin Barracuda Data 5 decembrie 2012 23:07:46
Problema Overlap Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.5 kb
#include<fstream>
#include<cstring>
#include<algorithm>

#define dim 850


using namespace std;

int poz,jdx,idx;
int i,j,n;
int odd;
int R[dim],rez[dim],w,shiftx,shifty,viz[dim],uz[dim],rots;
struct cub {
	int x,y;
}
v[dim],map[dim];
ifstream f("overlap.in");
ofstream g("overlap.out");
int cmp (cub a,cub  b){ 
	if(a.x!=b.x)
		return a.x<b.x;
	else
		return a.y<b.y;
	
	
}
void  rot(int k) {
	if(k==0)
		return ;
	int a,b;
	a=i;
	b=j;
	
	if(k==1){
		i=b;
		j=-a;
	}
	if(k==2){
		i=-a;
		j=-b;
	}
	if(k==3){
		i=-b;
		j=a;
	}
	
}
int bs (int i,int j) {
	int rs,m,ls;
	m=rs=0;
	ls=n+1;
	
	while(rs+1<ls) {
		m=(rs+ls)/2;
		if(v[m].x>i)
			ls=m;
		else {
			
			if(v[m].x<i)
				rs=m;
			else
				if(v[m].x==i) {
					if(v[m].y>j){
						ls=m;
					}
					else
						if(v[m].y<j)
							rs=m;
						else
							if(uz[m]==0)
								return m;
							else
								return -1;
				}
		}
	}
	return -1;
}
int check() {
	int idx;
int val=1;
	for(idx=1;idx<=n;++idx) {
		if(uz[idx]==0)
			val=0;
		else
			uz[idx]=0;
		
	}
	uz[0]=1;
	int jdx;
	for(idx=1;idx<=n;++idx) {
		
		if(uz[idx]==0 && viz[idx]!=0) {
			
			jdx=idx;
			odd=0;
			while (!uz[jdx]) {
				
				odd++;
				uz[jdx]=1;
			
				rez[jdx]=odd%2+1;
				jdx=viz[jdx];
				
				
			}
			if(odd%2)
				val=0;
			
			
			
			
		}
		
		
		
		
	}
	
	return val;
	
}
int main () {
	
	f>>n;
	
	int t=0;
	for(i=1;i<=n;++i){
		f>>v[i].x>>v[i].y;
		map[i]=v[i];
	}
	
	sort(v+1,v+1+n,cmp);
	
	
	for(rots=0; t==0 &&rots<=4;++rots) {
		
		for(idx=2;idx<=n;++idx)  {
			
			i=v[1].x;j=v[1].y;// ne folosim de primul punct
			
			rot(rots);//rotim primul punct
			
			memset(uz,0,sizeof(uz));
			memset(viz,0,sizeof(viz));
			uz[1]=1;
			viz[1]=idx;
			uz[idx]=1;
			shiftx=v[idx].x-i;
			shifty=v[idx].y-j;
			
			
			for(jdx=2;jdx<=n; ++jdx) {
				
				if(	uz[jdx]==0 ) {
					
					i=v[jdx].x;
					j=v[jdx].y;
					rot(rots);//il rotim ;
					//il transformam
					i+=shiftx;
					j+=shifty;
					//si ii cautam  binar pozitia
					
					w=bs(i,j);
					
					
					if(w>0) {// 
						
						uz[w]=uz[jdx]=1;
						viz[jdx]=poz;
						
						
					}
				}
			}
			
			if(check()){
				t=1;
			}
		}
	}
	
	
	for(idx=1;idx<=n;idx++)
        for (jdx=1; jdx<=n;jdx++)
            if (map[jdx].x==v[idx].x && map[jdx].y==v[idx].y) 
                R[jdx]=rez[idx];
			
    for(idx=1;idx<=n;idx++)
		  g<<R[idx]<<"\n";
	
	return 0;
}