Pagini recente » Cod sursa (job #2008875) | Cod sursa (job #1696274) | Cod sursa (job #1694165) | Cod sursa (job #1315545) | Cod sursa (job #448021)
Cod sursa(job #448021)
#include<fstream>
#include<algorithm>
#include<vector>
using namespace std;
struct trio
{
long long x, y;
long long z;
};
trio make_trio( long long x, long long y, long long z )
{
trio aux;
aux.x = x, aux.y = y, aux.z = z;
return aux;
}
bool operator == ( trio a, trio b )
{
return a.x == b.x && a.y == b.y && a.z == b.z;
}
void read();
void write();
void comp();
inline long long cmmdc( long long a, long long b )
{
if ( b == 0 )
return a;
return cmmdc( b, a % b );
}
inline long long absol( long long a )
{
return a < 0 ? a * -1 : a;
}
inline bool cmp( const trio& a, const trio& b )
{
if ( a.z != b.z )
return a.z < b.z;
if ( a.x != b.x )
return a.x < b.x;
return a.y <= b.y;
}
long long n, cnt;
vector<trio> pct;
vector<trio> pnt;
int main()
{
read();
comp();
write();
return 0;
}
void read()
{
ifstream fin( "trapez.in" );
fin >> n;
pct.resize( n );
for ( long long i = 0; i < n; ++i )
fin >> pct[i].x >> pct[i].y;
fin.close();
}
void write()
{
ofstream fout( "trapez.out" );
fout << cnt;
fout.close();
}
void comp()
{
for ( long long i = 0; i < n - 1; ++i )
for ( long long j = i + 1; j < n; ++j )
{
long long ax1 = pct[i].y - pct[j].y,
ax2 = pct[i].x - pct[j].x;
long long semn;
if ( ( ax1 >= 0 && ax2 >= 0 ) || ( ax1 < 0 && ax2 < 0 ) )
semn = 0;
else
semn = 1;
ax1 = absol(ax1), ax2 = absol(ax2);
if ( ax1 != 0 && ax2 != 0 )
{
long long d = cmmdc( ax1, ax2 );
ax1 /= d, ax2 /= d;
}
else
{
if ( ax1 == 0 )
ax1 = ax2 = 0;
else
ax1 = ax2 = -1;
}
pnt.push_back( make_trio( ax1, ax2, semn ) );
}
sort( pnt.begin(), pnt.end(), cmp );
trio old;
old.x = old.y = -1;
long long now = 1;
for ( long long i = 0; i < (long long) pnt.size(); ++i )
if ( pnt[i] == old )
++now;
else
{
if ( now != 1 )
cnt += now * ( now - 1 ) / 2;
old = pnt[i];
now = 1;
}
}