All Manhattan Distances
Explicación
Nuestra respuesta se puede escribir como:
Las contribuciones de las coordenadas y de las coordenadas se pueden tratar por separado. Mantendremos dos arreglos ordenados, uno con los valores de y otro con los de . Recordemos la definición explícita del valor absoluto:
Al recorrer cada arreglo en orden creciente, sabemos exactamente que el valor aporta a las distancias de los valores anteriores a , y aporta a las distancias de los valores posteriores. Como los arreglos están ordenados, sabemos cuántos valores hay antes y después de cada valor , lo que nos permite sumar estas contribuciones directamente tanto para los valores de como para los de .
Implementación
Complejidad temporal:
#include <bits/stdc++.h>
using namespace std;
// Tipo de datos para entero de 128 bits
void print_int128(__int128 x) {
if (x == 0) {
cout << 0;
return;
}
if (x < 0) {
cout << '-';
x = -x;
}
string res;
while (x > 0) {
res += (x % 10) + '0';
x /= 10;
}
reverse(res.begin(), res.end());
cout << res;
}
int main() {
int n;
cin >> n;
vector<long long> x(n), y(n);
for (int i = 0; i < n; i++) { cin >> x[i] >> y[i]; }
sort(x.begin(), x.end());
sort(y.begin(), y.end());
// BigInt en C++
__int128 sum(0);
for (int i = 0; i < n; i++) {
// (i - 1) signos + y (n - i) signos -
long long contrib = 2 * i - (n - 1);
sum = sum + contrib * (x[i] + y[i]);
}
print_int128(sum);
}