Pagini recente » Cod sursa (job #2280806) | Cod sursa (job #910746) | Cod sursa (job #945969) | Cod sursa (job #1598725) | Cod sursa (job #2244851)
#include <fstream>
#include <cstdio>
#include <queue>
#include <cmath>
#include <algorithm>
#define VAL 200005
#define PI 3.14159265
using namespace std;
struct eveniment
{
double nr;
int inter;
char semn;
};
eveniment EV[2*VAL];
int N, M, i, j, K, st[VAL], top;
int X[VAL], Y1[VAL], Y2[VAL], ANS;
double A, B;
bool ok[VAL];
void Unghi(double &U, int X, int Y)
{
U=atan2(Y, X)*180 / PI;
U+=90;
if (U>=360)
U-=360;
}
bool cmp(eveniment A, eveniment B)
{
if (A.nr!=B.nr)
return A.nr<B.nr;
if (A.semn=='+')
return true;
return false;
}
char buff[VAL];
int poz=0;
int citeste()
{
int semn=1, nr=0;
while (buff[poz]<'0' || '9'<buff[poz])
{
if (buff[poz]=='-')
semn=-1;
if (++poz==VAL)
fread(buff, 1, VAL, stdin), poz=0;
}
while ('0'<=buff[poz] && buff[poz]<='9')
{
nr=nr*10+buff[poz]-'0';
if (++poz==VAL)
fread(buff, 1, VAL, stdin), poz=0;
}
return nr*semn;
}
int main()
{
freopen("rays.in", "r", stdin);
freopen("rays.out", "w", stdout);
N=citeste();
for (i=1; i<=N; i++)
{
X[i]=citeste();
Y1[i]=citeste();
Y2[i]=citeste();
Unghi(A, X[i], Y1[i]);
Unghi(B, X[i], Y2[i]);
if (A>B)
swap(A, B);
EV[++M].nr=A;
EV[M].semn='+';
EV[M].inter=i;
EV[++M].nr=B;
EV[M].semn='-';
EV[M].inter=i;
}
sort(EV+1, EV+M+1, cmp);
for (i=1; i<=M; i++)
{
if (EV[i].semn=='+')
st[++top]=EV[i].inter;
else
{
if (ok[EV[i].inter]==false)
{
ANS++;
while (top>0)
{
ok[st[top]]=true;
top--;
}
}
}
}
printf("%d\n", ANS);
return 0;
}