#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#define EPS 0.000001
using namespace std;
class owad
{
int ilosc_kolizji;
float xs, xf, yf, a, b;
bool dopuszczona, punkt_prosta_pionowa;
void interpoluj();
public:
owad();
owad(int xs, int xf, int yf);
void PunktyWspolne(owad &bied);
bool CzyDopuszczona() { return dopuszczona; }
bool CzyKolizje() { if (ilosc_kolizji > 0) return true; else return false; }
void ZerujKolizje() { ilosc_kolizji = 0; }
void Zabron() { dopuszczona = false; ilosc_kolizji = 0; /*cout << "bronie" << endl;*/ }
bool operator < (const owad& bied) const
{
//cout << "sortuje" << endl;
return (ilosc_kolizji < bied.ilosc_kolizji);
}
};
int main()
{
int ilosc, xs, xf, yf, ilosc_dopuszczonych, licz = 0;
vector <owad> biedronka;
cin >> ilosc;
biedronka.reserve(ilosc);
for (int i = 0; i < ilosc; ++i)
{
cin >> xs >> xf >> yf;
biedronka.push_back(owad(xs, xf, yf));
}
///////////////////////////////////////////////////////////////////
do
{
for (int i = 0; i < ilosc; ++i)
{
biedronka[i].ZerujKolizje();
}
for (int i = 0; i < ilosc; ++i)
{
for (int j = i; j < ilosc; ++j)
{
if ((i != j) && (biedronka[i].CzyDopuszczona()) && (biedronka[j].CzyDopuszczona()))
{
biedronka[i].PunktyWspolne(biedronka[j]);
//cout << "szukam punktow wspolnych " << i << "z " << j << endl;
}
}
}
sort(biedronka.begin(), biedronka.end()); //trasa o najwiekszej ilosci kolizji na koniec wektora
/*for (int i = 0; i < ilosc; ++i)
{
cout << biedronka[i].ilosc_kolizji << endl;
}*/
if (biedronka[ilosc-1].CzyKolizje())
{
biedronka[ilosc-1].Zabron();
//cout << "wykryto kolizje" << endl;
}
//cout << licz << endl;
//++licz;
sort(biedronka.begin(), biedronka.end());
} while (biedronka[ilosc-1].CzyKolizje());
ilosc_dopuszczonych = 0;
//cout << endl << ilosc_dopuszczonych << endl;
for (int i = 0; i < ilosc; ++i)
{
if (biedronka[i].CzyDopuszczona())
{
++ilosc_dopuszczonych;
}
}
cout << ilosc_dopuszczonych << endl;
//system("pause");
return 0;
}
void owad::interpoluj()
{
if (fabs(xs - xf) < EPS)
{
punkt_prosta_pionowa = true;
}
else
{
a = -yf / (xs - xf);
b = (xs*yf) / (xs - xf);
//cout << a << endl << b << endl;
}
}
owad::owad(int xs, int xf, int yf) : dopuszczona(true), punkt_prosta_pionowa(false), xs(xs), xf(xf), yf(yf), ilosc_kolizji(0)
{
interpoluj();
}
void owad::PunktyWspolne(owad &bied)
{
float wspolny_x, wspolny_y;
if ((punkt_prosta_pionowa) && (bied.punkt_prosta_pionowa))
{
if (fabs(xs - bied.xs) < EPS)
{
++ilosc_kolizji;
++bied.ilosc_kolizji;
//cout << "tu jest kolizja" << endl;
}
} else
if ((punkt_prosta_pionowa) && !(bied.punkt_prosta_pionowa))
{
//cout << (xs * bied.a + bied.b) << endl;
if (((((xs * bied.a + bied.b) < yf) || (fabs((xs * bied.a + bied.b) - yf) < EPS)) && (((xs * bied.a + bied.b) > 0)||(fabs(xs * bied.a + bied.b)<EPS))) && (((bied.xs < xs) || (fabs(bied.xs - xs) < EPS)) && ((bied.xf > xs) || (fabs(bied.xf - xs) < EPS)) || (((bied.xs > xs) || (fabs(bied.xs - xs) < EPS)) && ((bied.xf < xs) || (fabs(bied.xf - xs) < EPS)))))
{
{
++ilosc_kolizji;
++bied.ilosc_kolizji;
}
}
} else
if ((bied.punkt_prosta_pionowa) && !(punkt_prosta_pionowa))
{
if (((((bied.xs * a + b) < bied.yf) || (fabs((bied.xs * a + b) - bied.yf) < EPS)) && (((bied.xs * a + b) > 0)||(fabs(bied.xs * a + b)<EPS))) && (((xs < bied.xs) || (fabs(xs - bied.xs) < EPS)) && ((xf > bied.xs) || (fabs(xf - bied.xs) < EPS)) || (((xs > bied.xs) || (fabs(xs-bied.xs) < EPS)) && ((xf < bied.xs) || (fabs(xf-bied.xs) < EPS)))))
{
{
++ilosc_kolizji;
++bied.ilosc_kolizji;
}
//cout << "kolizja" << endl;
}
}
else
if (!(punkt_prosta_pionowa) && !(bied.punkt_prosta_pionowa))
{
//cout << "dzialam" << endl;
//cout << bied.a << endl << a << endl;
if (fabs(bied.a - a) > EPS)
{
wspolny_x = (b - bied.b) / (bied.a - a);
wspolny_y = (bied.a * b - a * bied.b) / (bied.a - a);
//cout << wspolny_x << endl << wspolny_y << endl;
if (((((wspolny_x > xs) || (fabs(wspolny_x - xs) < EPS)) && ((wspolny_x < xf) || (fabs(wspolny_x - xf) < EPS))) || (((wspolny_x < xs) || (fabs(wspolny_x - xs) < EPS)) && ((wspolny_x > xf) || (fabs(wspolny_x - xf) < EPS)))) && (((wspolny_y > 0) || (fabs(wspolny_y<EPS))) && ((wspolny_y < yf) || (fabs(wspolny_y - yf) < EPS ))))
{
//if ((((wspolny_x >= bied.xs) && (wspolny_x <= bied.xf)) || ((wspolny_x <= bied.xs) && (wspolny_x >= bied.xf))) && ((wspolny_y > 0) && (wspolny_y <= bied.yf)))
if (((((wspolny_x > bied.xs) || (fabs(wspolny_x - bied.xs) < EPS)) && ((wspolny_x < bied.xf) || (fabs(wspolny_x - bied.xf) < EPS))) || (((wspolny_x < bied.xs) || (fabs(wspolny_x - bied.xs) < EPS)) && ((wspolny_x > bied.xf) || (fabs(wspolny_x - bied.xf) < EPS)))) && (((wspolny_y > 0)||(fabs(wspolny_y<EPS))) && ((wspolny_y < bied.yf) || (fabs(wspolny_y - bied.yf) < EPS))))
{
//cout << "dzialam" << endl;
++ilosc_kolizji;
++bied.ilosc_kolizji;
}
}
}
else
{
if ((fabs(a - bied.a) < EPS) && (fabs(b - bied.b) < EPS))
{
{
++ilosc_kolizji;
++bied.ilosc_kolizji;
}
}
}
}
}