Estupendo intento, Loretz, buena exhibición de recursos... No obstante creo que el punto flaco reside en la llamada que haces a lower_bound, lo que eleva la complejidad de tu algoritmo a O(Nlog(N)). Mejor que cuadrático O(N^2), al menos...
A ver que te parece ésta, en O(N): Brevemente, para evitar llamadas a lower_bound, controlas con una variable extra m, que parte del vector recorrido YA sabes que no va a emparejar con el actual en curso V[n], por lo que no hace falta volver a recorrer...
Ah!, y lo mismo vale para vectores vacíos
A ver si pudieras medir tiempos con tus clases C++...
Cita de: Loretz en 18 Septiembre 2019, 23:56 PM
...
for (auto i = v.begin(), j = v.end();
i != j && it != j;
++i)
{
auto s = *i + k;
it = std::lower_bound(it, j, s);
if (it != j && *it == s) {
++n;
++it;
}
}
...
A ver que te parece ésta, en O(N): Brevemente, para evitar llamadas a lower_bound, controlas con una variable extra m, que parte del vector recorrido YA sabes que no va a emparejar con el actual en curso V[n], por lo que no hace falta volver a recorrer...
Ah!, y lo mismo vale para vectores vacíos
Código (cpp) [Seleccionar]
/*
P : strict(V)
fun k_paired(V[0..N) of int, int k) dev r
Q : r =#i,j : 0 <= i , j<N : V[j]-V[i]=k
I : Q[N/n] and 0 <= m <= n <= N and
n<N -> \forall i : 0<=i < m : V[n]-V[i] > k **
** m for efficiency reasons, discarding
subtrahends V[i] far from V[n].
!B : n==N B: n<N
C(N,n,m)= 2N - (m+n) >= 0
Invariant snapshot:
-------------------
k = 20 , r = 0
0 m n N
+-----+-----+-----+-----+-...-+-----+-----+-----+-----+-...-+
| 1 | 3 | 5 | 40 | | | 49 | 50 | 60 | |
+-----+-----+-----+-----+-...-+-----+-----+-----+-----+-...-+
*/
#include <iostream>
using namespace std;
int k_paired(const int V[], const int N, const int k)
{
int n,m,r;
for(n=m=r=0;n<N;)
if (V[n]-V[m] <= k)
r+=(V[n++]-V[m] == k);
else m++;
return r;
}
#define MAX 100000
int main(int argc, char **args)
{
int N,k;
int V[MAX];
for(cin >> N ; N!=-1 ; cin>>N)
{
cin >> k;
for(int n=0;n<N;n++)
cin >> V[n];
cout << k_paired(V,N,k) << endl;
}
return 0;
}
A ver si pudieras medir tiempos con tus clases C++...