Recuento de pares desordenados (x, y) de Array que satisfacen la ecuación dada

Dada una array arr[] de N enteros tanto positivos como negativos, nuestra tarea es encontrar el número de pares desordenados (x, y) que satisfacen las ecuaciones dadas: 

  • | x | > = min(| x – y|, | x + y|)
  • | y | < = máx(| x – y|, | x + y|)

Ejemplos: 

Entrada: arr[] = [ 2, 5, -3 ] 
Salida:
Explicación: 
Los posibles pares no ordenados son (5, -3) y (2, -3). (2, 5) no se cuenta porque no cumple las condiciones. 

Entrada: arr[] = [ 3, 6 ] 
Salida:
Explicación: 
El par [3, 6] satisface la condición. Por lo tanto, la salida es 1. 

Enfoque ingenuo: 
para resolver el problema mencionado anteriormente, el método ingenuo es atravesar todos los pares posibles y no contar los pares desordenados que satisfacen estas condiciones. Pero este método es costoso y requiere más tiempo, lo que puede optimizarse aún más.

Tiempo Complejidad: O(N 2
Espacio auxiliar : O(1)

Enfoque eficiente: 
para optimizar el método anterior, la idea principal es ordenar la array y luego aplicar la búsqueda binaria para encontrar el límite correcto para cada índice de la array. Tenemos que observar que si cambiamos x a – x ​​, entonces los valores de |x| y |y| permanece igual, mientras que |x – y| y |x + y| intercambiará valores. Esto significa que el par {x, y} funciona si y solo si funciona {-x, y}. Del mismo modo, podemos cambiar el signo de y. Esto significa que podemos reemplazar x e y por sus valores absolutos , y el par original funciona si y solo si funciona el nuevo.

Si x > = 0 y y > = 0 entonces la condición se convierte en |x – y | < = x, y < = x + y . El límite superior siempre se cumple, mientras que el límite inferior es equivalente a x < = 2 * y y y < = 2 * x

Entonces el problema se reduce a contar el número de pares {x, y} con |x| <= 2|año| y |y| <= 2|x| . Para resolver esto, tomamos los valores absolutos de todos los A[i] y ordenamos el arreglo que es el número de pares (l, r) con l < r y a[r] < = 2 * a[l]. Para cada l fijo, calculamos el r más grande que satisface esta condición, y simplemente lo sumamos con la respuesta.

A continuación se muestra la implementación del enfoque anterior: 

C++

// C++ Program to find the number of
// unordered pairs (x, y) which satisfy
// the given equation for the array
 
#include <bits/stdc++.h>
using namespace std;
 
// Return the number of unordered
// pairs satisfying the conditions
int numPairs(int a[], int n)
 
{
    int ans, i, index;
 
    // ans stores the number
    // of unordered pairs
    ans = 0;
 
    // Making each value of
    // array to positive
    for (i = 0; i < n; i++)
        a[i] = abs(a[i]);
 
    // Sort the array
    sort(a, a + n);
 
    // For each index calculating
    // the right boundary for
    // the unordered pairs
    for (i = 0; i < n; i++) {
 
        index = upper_bound(
                    a,
                    a + n,
                    2 * a[i])
                - a;
        ans += index - i - 1;
    }
 
    // Return the final result
    return ans;
}
 
// Driver code
int main()
{
    int a[] = { 3, 6 };
    int n = sizeof(a)
            / sizeof(a[0]);
 
    cout << numPairs(a, n)
         << endl;
 
    return 0;
}

Java

// Java Program to find the number of
// unordered pairs (x, y) which satisfy
// the given equation for the array
import java.util.Arrays;
class GFG{
     
// Return the number of unordered
// pairs satisfying the conditions
static int numPairs(int a[], int n)
{
    int ans, i, index;
 
    // ans stores the number
    // of unordered pairs
    ans = 0;
 
    // Making each value of
    // array to positive
    for (i = 0; i < n; i++)
        a[i] = Math.abs(a[i]);
 
    // Sort the array
    Arrays.sort(a);
 
    // For each index calculating
    // the right boundary for
    // the unordered pairs
    for (i = 0; i < n; i++)
    {
        index = 2;
        ans += index - i - 1;
    }
 
    // Return the final result
    return ans;
}
 
// Driver code
public static void main(String []args)
{
    int a[] = new int[]{ 3, 6 };
    int n = a.length;
 
    System.out.println(numPairs(a, n));
}
}
 
// This code is contributed by rock_cool

Python3

# Python3 program to find the number of
# unordered pairs (x, y) which satisfy
# the given equation for the array
  
# Return the number of unordered
# pairs satisfying the conditions
def numPairs(a, n):
  
    # ans stores the number
    # of unordered pairs
    ans = 0
  
    # Making each value of array
    # to positive
    for i in range(n):
        a[i] = abs(a[i])
  
    # Sort the array
    a.sort()
  
    # For each index calculating
    # the right boundary for
    # the unordered pairs
    for i in range(n):
        index = 0
         
        for j in range(i + 1, n):
            if (2 * a[i] >= a[j - 1] and
                2 * a[i] < a[j]):
                index = j
                 
        if index == 0:
            index = n
             
        ans += index - i - 1
  
    # Return the final result
    return ans
  
# Driver code
a = [ 3, 6 ]
n = len(a)
 
print(numPairs(a, n))
 
# This code is contributed by avanitrachhadiya2155

C#

// C# Program to find the number of
// unordered pairs (x, y) which satisfy
// the given equation for the array
using System;
class GFG{
     
// Return the number of unordered
// pairs satisfying the conditions
static int numPairs(int []a, int n)
{
    int ans, i, index;
 
    // ans stores the number
    // of unordered pairs
    ans = 0;
 
    // Making each value of
    // array to positive
    for (i = 0; i < n; i++)
        a[i] = Math.Abs(a[i]);
 
    // Sort the array
    Array.Sort(a);
 
    // For each index calculating
    // the right boundary for
    // the unordered pairs
    for (i = 0; i < n; i++)
    {
        index = 2;
        ans += index - i - 1;
    }
 
    // Return the final result
    return ans;
}
 
// Driver code
public static void Main()
{
    int []a = new int[]{ 3, 6 };
    int n = a.Length;
 
    Console.Write(numPairs(a, n));
}
}
 
// This code is contributed by Code_Mech

Javascript

<script>
    // Javascript Program to find the number of
    // unordered pairs (x, y) which satisfy
    // the given equation for the array
     
    // Return the number of unordered
    // pairs satisfying the conditions
    function numPairs(a, n)
    {
        let ans, i, index;
 
        // ans stores the number
        // of unordered pairs
        ans = 0;
 
        // Making each value of
        // array to positive
        for (i = 0; i < n; i++)
            a[i] = Math.abs(a[i]);
 
        // Sort the array
        a.sort();
 
        // For each index calculating
        // the right boundary for
        // the unordered pairs
        for (i = 0; i < n; i++)
        {
            index = 2;
            ans += index - i - 1;
        }
 
        // Return the final result
        return ans;
    }
 
    let a = [ 3, 6 ];
    let n = a.length;
  
    document.write(numPairs(a, n));
     
</script>
Producción: 

1

 

Complejidad de Tiempo: O(n * log n) 
Espacio Auxiliar: O(1)
 

Publicación traducida automáticamente

Artículo escrito por ujjwalmittal y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *