Cod sursa(job #526421)

Utilizator matei_cChristescu Matei matei_c Data 28 ianuarie 2011 12:13:09
Problema Energii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include<stdio.h>
#include<algorithm>
using namespace std;

int n,x[1001],y[1001],c[1001],v[1001],nr;
int main()
{
	int i,p1,p2,j,abscisa1,abscisa2,ordonata1,ordonata2,dr,st,m;
	bool ok1,ok2;
	freopen("dreptc.in","r",stdin);
	freopen("dreptc.out","w",stdout);
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%d%d%d",&x[i],&y[i],&c[i]);
		x[i]+=1000;
		y[i]+=1000;
		v[i]=(2001*x[i]+y[i])*6+c[i];
	}	
	sort(v+1,v+n+1);
	for(i=1;i<n;i++)
	{
		for(j=i+1;j<=n;j++)
		{
			ok1=false;
			ok2=false;
			abscisa1=(v[i]-v[i]%6)/6-(v[i]%2001);
			abscisa2=(v[j]-v[j]%6)/6-(v[j]%2001);
			ordonata1=((v[i]-v[i]%6)/6)%2001;
			ordonata2=((v[j]-v[j]%6)/6)%2001;
			if(v[i]%6==v[j]%6 && abscisa1!=abscisa2 && ordonata1!=ordonata2)
			{
				p1=abscisa2 + ordonata1 + v[i]%6;
				p2=abscisa1 + ordonata2 + v[i]%6;
				st=1;dr=n;
				while(st<=dr)
				{
					m=(st+dr)/2;
					if(v[m]<p1)
						dr=m-1;
					if(v[m]>p1)
						st=m+1;
					if(v[m]==p1)
					{
						ok1=true;
						break;
					}	
				}	
				/////////////////////////////////////
				st=1;dr=n;	
				while(st<=dr)
				{
					m=(st+dr)/2;
					if(v[m]<p2)
						dr=m-1;
					if(v[m]>p2)
						st=m+1;
					if(v[m]==p2)
					{
						ok2=true;
						break;
					}	
				}	
			}	
			if(ok1==true && ok2==true)
				nr++;				
		}	
	}	
	printf("%d\n",nr);
	return 0;
}