Cod sursa(job #1824533)

Utilizator TincaMateiTinca Matei TincaMatei Data 7 decembrie 2016 22:50:02
Problema Oite Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <cstdio>
#include <algorithm>

const int MAX_N = 1024;
int v[MAX_N];

struct Oitze {
  int o1, o2, sum;
} oi[MAX_N * MAX_N];

bool cmp(Oitze a, Oitze b) {
  return a.sum < b.sum || (a.sum == b.sum && a.o2 < b.o2);
}

int bin(int n, int s, int o) {
  int st, dr, mid;
  st = 0;
  dr = n;
  while(dr - st > 1) {
    mid = (st + dr) / 2;
    if(oi[mid].sum < s || (oi[mid].sum == s && oi[mid].o2 <= o))
      st = mid;
    else
      dr = mid;
  }
  return st;
}

int main() {
  int c, l, top;
  long long rez;
  FILE *fin = fopen("oite.in", "r");
  fscanf(fin, "%d%d", &c, &l);
  for(int i = 0; i < c; ++i)
    fscanf(fin, "%d", &v[i]);
  fclose(fin);

  top = 0;
  for(int i = 1; i < c; ++i)
    for(int j = 0; j < i; ++j) {
      oi[top].o1 = j;
      oi[top].o2 = i;
      oi[top].sum = v[i] + v[j];
      ++top;
    }

  std::sort(oi, oi + top, cmp);

  rez = 0LL;
  for(int i = 0; i < top; ++i) {
    rez = rez + bin(top, l - oi[i].sum, oi[i].o1 - 1) -
                bin(top, l - oi[i].sum, -1);
  }

  FILE *fout = fopen("oite.out", "w");
  fprintf(fout, "%lld", rez);
  fclose(fout);
  return 0;
}