Cod sursa(job #1033594)

Utilizator AnonymouslegionAnonymous Anonymouslegion Data 17 noiembrie 2013 12:09:15
Problema Trapez Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <cstdio>
#include <cstring>
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>

#define f first
#define s second
#define mp make_pair

using namespace std;

int neg(pair<int, int> x){
  if(x.s < 0 && x.f > 0)
    return 1;
  if(x.s > 0 && x.f < 0)
    return 1;
  return 0;
}

int cmp(pair<int, int> x, pair<int, int> y){
  if(neg(x) && !neg(y))
    return 1;
  if(neg(y) && !neg(x))
    return 0;
  return (long long)x.f * y.s < (long long)y.f * x.s;
}

int eq(pair<int, int> x, pair<int, int> y){
  if(x.s == 0 && y.s == 0)
    return 1;
  if(x.s == 0 || y.s == 0)
    return 0;

  return (long long)x.f * y.s == (long long)y.f * x.s;
}

int main(){
  ifstream in("trapez.in");
  ofstream out("trapez.out");

  vector<pair<int, int> > gv, srt;
  int n;

  in >> n;

  for(int i = 1; i <= n; ++i){
    pair<int, int> x;
    in >> x.f >> x.s;
    gv.push_back(x);
  }

  for(int i = 0; i < gv.size(); ++i)
    for(int j = i + 1; j < gv.size(); ++j)
      srt.push_back(mp(gv[i].s - gv[j].s, gv[i].f - gv[j].f));

  sort(srt.begin(), srt.end(), cmp);

  int evil = 1;
  long long ans = 0;
  for(int i = 1; i < srt.size(); ++i)
    if(eq(srt[i], srt[i - 1])){
      ++evil;
    }
    else{
      ans = ans + (long long)evil * (evil - 1) / 2;
      evil = 1;
    }

  if(evil)
    ans = ans + (long long)evil * (evil - 1) / 2;

  out << ans;

  return 0;
}