Pagini recente » Cod sursa (job #1457457) | Cod sursa (job #509193) | Cod sursa (job #164347) | Cod sursa (job #2805942) | Cod sursa (job #2405187)
#include <bits/stdc++.h>
using namespace std;
struct dd
{
int x,y,z;
};
const double eps=1.e-14;
/// cadranele 2 cu 3;
dd cadr[200005];
/// cadranele 1 cu 4;
dd cadr1[200005];
struct adj
{
double panta,panta1;
};
adj v[200005];
bool cmp(adj a,adj b)
{
if(fabs(a.panta1-b.panta1)<=eps)
{if(a.panta-b.panta<=-1*eps)
return 1;
return 0;
}
if(a.panta1-b.panta1<=eps)
return 1;
return 0;
}
int main()
{
freopen("rays.in","r",stdin);
freopen("rays.out","w",stdout);
int n, i ,cnt1=0,cnt2=0;
scanf("%d",&n);
for(i=1;i<=n;++i)
{
dd a;
scanf("%d%d%d",&a.z,&a.x,&a.y);
if(a.z<0)
cadr[++cnt1]=a;
else
cadr1[++cnt2]=a;
}
for(i=1;i<=cnt1;++i)
{
v[i].panta=atan2(-1*cadr[i].z,cadr[i].x);
v[i].panta1=atan2(-1*cadr[i].z,cadr[i].y);
double a1=v[i].panta;
double b1=v[i].panta1;
if(a1-b1>=eps)
v[i].panta=b1,v[i].panta1=a1;
}
///(x,y) (-x
sort(v+1,v+cnt1+1,cmp);
int cnt=(cnt1>=1);
adj a=v[1];
for(i=2;i<=cnt1;++i)
{
if(v[i].panta-a.panta1>=eps)
{
cnt++;
a=v[i];
continue;
}
if(a.panta-v[i].panta<=-1*eps)a.panta=v[i].panta;
}
for(i=1;i<=cnt2;++i)
{
v[i].panta=atan2(cadr1[i].z,-1*cadr1[i].x);
v[i].panta1=atan2(cadr1[i].z,-1*cadr1[i].y);
double a1=v[i].panta;
double b1=v[i].panta1;
if(a1-b1>=eps)
v[i].panta=b1,v[i].panta1=a1;
}
sort(v+1,v+cnt2+1,cmp);
int cnt3=(cnt2>=1);
a=v[1];
for(i=2;i<=cnt2;++i)
{
if(v[i].panta-a.panta1>=eps)
{
cnt3++;
a=v[i];
continue;
}
if(a.panta-v[i].panta<=-1*eps)a.panta=v[i].panta;
}
printf("%d\n",cnt+cnt3);
return 0;
}