typedef pair Punto; float distanciaAlCuadrado(const Punto & p1, const Punto & p2) { float a = p2.first - p1.first; float b = p2.second - p1.second; return a * a + b * b; } bool compararY(const Punto & p1, const Punto & p2) { return p1.second < p2.second; } float distanciaMinima(const vector & puntosOrdenadosX, const vector & puntosOrdenadosY) { int talla = puntosOrdenadosX.size(); if (talla == 2) return distanciaAlCuadrado(puntosOrdenadosX[0], puntosOrdenadosX[1]); if (talla == 3) return min({distanciaAlCuadrado(puntosOrdenadosX[0], puntosOrdenadosX[1]), distanciaAlCuadrado(puntosOrdenadosX[0], puntosOrdenadosX[2]), distanciaAlCuadrado(puntosOrdenadosX[1], puntosOrdenadosX[2])}); int tallaIzquierda = talla / 2, tallaDerecha = talla - tallaIzquierda; vector puntosOrdenadosXIzquierda(tallaIzquierda), puntosOrdenadosXDerecha(tallaDerecha), puntosOrdenadosYIzquierda(tallaIzquierda), puntosOrdenadosYDerecha(tallaDerecha); for (int i = 0; i < tallaIzquierda; i++) puntosOrdenadosXIzquierda[i] = puntosOrdenadosX[i]; for (int i = 0; i < tallaDerecha; i++) puntosOrdenadosXDerecha[i] = puntosOrdenadosX[i + tallaIzquierda]; for (int i = 0, j = 0, k = 0; i < talla; i++) if (puntosOrdenadosY[i] < puntosOrdenadosXDerecha[0]) puntosOrdenadosYIzquierda[j++] = puntosOrdenadosY[i]; else puntosOrdenadosYDerecha[k++] = puntosOrdenadosY[i]; float minima = min(distanciaMinima(puntosOrdenadosXIzquierda, puntosOrdenadosYIzquierda), distanciaMinima(puntosOrdenadosXDerecha, puntosOrdenadosYDerecha)); for (int i = 0; i < puntosOrdenadosYIzquierda.size(); i++) for (int j = 0; j < puntosOrdenadosYDerecha.size(); j++) minima = min(minima, distanciaAlCuadrado(puntosOrdenadosYIzquierda[i], puntosOrdenadosYDerecha[j])); return minima; } float distanciaMinima(const vector & puntos) { vector puntosOrdenadosX(puntos), puntosOrdenadosY(puntos); sort(puntosOrdenadosX.begin(), puntosOrdenadosX.end()); for (int i = 0; i < puntosOrdenadosX.size() - 1; i++) if (puntosOrdenadosX[i] == puntosOrdenadosX[i + 1]) return 0; sort(puntosOrdenadosY.begin(), puntosOrdenadosY.end(), compararY); return sqrt(distanciaMinima(puntosOrdenadosX, puntosOrdenadosY)); }