Queries on probability of even or odd number in given ranges
Given an array A of size N, containing integers. We have to answer Q queries where each query is of the form:
- K L R : If K = 0, then you have to find the probability of choosing an even number from the segment [L, R] (both inclusive) in the array A.
- K L R : If K = 1, then you have to find the probability of choosing an odd number from the segment [L, R] (both inclusive) in the array A.
For each query print two integers p and q which represent the probability p/q. Both p and q are reduced to the minimal form.
If p is 0 print 0 or if p is equal to q print 1, otherwise print p and q alone.
Examples:
Input : N = 5, arr[] = { 6, 5, 2, 1, 7 }
query 1: 0 2 2
query 2: 1 2 5
query 3: 0 1 4
Output : 0
3 4
1 2
Explanation :
First query is to find probability of even
element in range [2, 2]. Since range contains
a single element 5 which is odd, the answer
is 0. Second query is to find probability of
odd element in range [2, 5]. There are 3
odd elements in range probability is 3/4.
Third query is for even elements in range
from 1 to 4. Since there are equal even
and odd elements, probability is 2/4
which is 1/2.
The idea is to maintain two arrays, say even[] and odd[], which maintain the number of even or odd element upto index i. Now, to answer each query, we can compute result denominator q by finding number of element in the given query range. To find result numerator, we remove number of elements upto l – 1 from elements upto r.
To output the answer in minimal form, we find the GCD of p and q and output p/gcd and q/gcd. For answer 0 and 1, we will explicitly specify the conditions.
Below is the implementation of this approach:
C++
#include <bits/stdc++.h>
using namespace std;
#define C 3
void solveQuery( int arr[], int n, int Q,
int query[][C])
{
int even[n + 1];
int odd[n + 1];
even[0] = odd[0] = 0;
for ( int i = 0; i < n; i++) {
if (arr[i] & 1) {
odd[i + 1] = odd[i] + 1;
even[i + 1] = even[i];
}
else {
even[i + 1] = even[i] + 1;
odd[i + 1] = odd[i];
}
}
for ( int i = 0; i < Q; i++) {
int r = query[i][2];
int l = query[i][1];
int k = query[i][0];
int q = r - l + 1;
int p;
if (k)
p = odd[r] - odd[l - 1];
else
p = even[r] - even[l - 1];
if (!p)
cout << "0" << endl;
else if (p == q)
cout << "1" << endl;
else {
int g = __gcd(p, q);
cout << p / g << " " << q / g << endl;
}
}
}
int main()
{
int arr[] = { 6, 5, 2, 1, 7 };
int n = sizeof (arr) / sizeof (arr[0]);
int Q = 2;
int query[Q][C] = {
{ 0, 2, 2 },
{ 1, 2, 5 }
};
solveQuery(arr, n, Q, query);
return 0;
}
|
Java
import java.io.*;
public class GFG {
static int __gcd( int a, int b)
{
if (a == 0 || b == 0 )
return 0 ;
if (a == b)
return a;
if (a > b)
return __gcd(a - b, b);
return __gcd(a, b - a);
}
static void solveQuery( int []arr,
int n, int Q, int [][]query)
{
int []even = new int [n + 1 ];
int []odd = new int [n + 1 ];
even[ 0 ] = odd[ 0 ] = 0 ;
for ( int i = 0 ; i < n; i++)
{
if ((arr[i] & 1 ) > 0 )
{
odd[i + 1 ] = odd[i] + 1 ;
even[i + 1 ] = even[i];
}
else
{
even[i + 1 ] = even[i] + 1 ;
odd[i + 1 ] = odd[i];
}
}
for ( int i = 0 ; i < Q; i++)
{
int r = query[i][ 2 ];
int l = query[i][ 1 ];
int k = query[i][ 0 ];
int q = r - l + 1 ;
int p;
if (k > 0 )
p = odd[r] - odd[l - 1 ];
else
p = even[r] - even[l - 1 ];
if (p <= 0 )
System.out.println( "0" );
else if (p == q)
System.out.println( "1" );
else
{
int g = __gcd(p, q);
System.out.println(p / g
+ " " + q / g);
}
}
}
static public void main (String[] args)
{
int []arr = { 6 , 5 , 2 , 1 , 7 };
int n = arr.length;
int Q = 2 ;
int [][]query = { { 0 , 2 , 2 },
{ 1 , 2 , 5 } };
solveQuery(arr, n, Q, query);
}
}
|
Python 3
import math
C = 3
def solveQuery(arr, n, Q, query):
even = [ 0 ] * (n + 1 )
odd = [ 0 ] * (n + 1 )
even[ 0 ] = 0
odd[ 0 ] = 0
for i in range ( n) :
if (arr[i] & 1 ) :
odd[i + 1 ] = odd[i] + 1
even[i + 1 ] = even[i]
else :
even[i + 1 ] = even[i] + 1
odd[i + 1 ] = odd[i]
for i in range ( Q) :
r = query[i][ 2 ]
l = query[i][ 1 ]
k = query[i][ 0 ]
q = r - l + 1
if (k):
p = odd[r] - odd[l - 1 ]
else :
p = even[r] - even[l - 1 ]
if ( not p):
print ( "0" )
elif (p = = q):
print ( "1" )
else :
g = math.gcd(p, q)
print ((p / / g), (q / / g))
if __name__ = = "__main__" :
arr = [ 6 , 5 , 2 , 1 , 7 ]
n = len (arr)
Q = 2
query = [[ 0 , 2 , 2 ],
[ 1 , 2 , 5 ]]
solveQuery(arr, n, Q, query)
|
C#
using System;
public class GFG {
static int __gcd( int a, int b)
{
if (a == 0 || b == 0)
return 0;
if (a == b)
return a;
if (a > b)
return __gcd(a - b, b);
return __gcd(a, b - a);
}
static void solveQuery( int []arr,
int n, int Q, int [,]query)
{
int []even = new int [n + 1];
int []odd = new int [n + 1];
even[0] = odd[0] = 0;
for ( int i = 0; i < n; i++)
{
if ((arr[i] & 1) > 0)
{
odd[i + 1] = odd[i] + 1;
even[i + 1] = even[i];
}
else
{
even[i + 1] = even[i] + 1;
odd[i + 1] = odd[i];
}
}
for ( int i = 0; i < Q; i++)
{
int r = query[i,2];
int l = query[i,1];
int k = query[i,0];
int q = r - l + 1;
int p;
if (k > 0)
p = odd[r] - odd[l - 1];
else
p = even[r] - even[l - 1];
if (p <= 0)
Console.WriteLine( "0" );
else if (p == q)
Console.WriteLine( "1" );
else
{
int g = __gcd(p, q);
Console.WriteLine(p / g
+ " " + q / g);
}
}
}
static public void Main ()
{
int []arr = { 6, 5, 2, 1, 7 };
int n = arr.Length;
int Q = 2;
int [,]query = { { 0, 2, 2 },
{ 1, 2, 5 } };
solveQuery(arr, n, Q, query);
}
}
|
PHP
<?php
function __gcd( $a , $b )
{
if ( $a == 0 || $b == 0)
return 0;
if ( $a == $b )
return $a ;
if ( $a > $b )
return __gcd( $a - $b , $b );
return __gcd( $a , $b - $a );
}
function solveQuery( $arr , $n , $Q , $query )
{
$even [0] = $odd [0] = 0;
for ( $i = 0; $i < $n ; $i ++)
{
if (( $arr [ $i ] & 1) > 0)
{
$odd [ $i + 1] = $odd [ $i ] + 1;
$even [ $i + 1] = $even [ $i ];
}
else
{
$even [ $i + 1] = $even [ $i ] + 1;
$odd [ $i + 1] = $odd [ $i ];
}
}
for ( $i = 0; $i < $Q ; $i ++)
{
$r = $query [ $i ][2];
$l = $query [ $i ][1];
$k = $query [ $i ][0];
$q = $r - $l + 1;
$p ;
if ( $k > 0)
$p = $odd [ $r ] - $odd [ $l - 1];
else
$p = $even [ $r ] - $even [ $l - 1];
if ( $p <= 0)
echo "0" . "\n" ;
else if ( $p == $q )
echo "1" . "\n" ;
else
{
$g = __gcd( $p , $q );
echo (int)( $p / $g ) . " " . (int)( $q / $g );
}
}
}
$arr = array (6, 5, 2, 1, 7);
$n = sizeof( $arr );
$Q = 2;
$query = array ( array (0, 2, 2),
array (1, 2, 5));
solveQuery( $arr , $n , $Q , $query );
|
Javascript
<script>
function __gcd(a,b)
{
if (a == 0 || b == 0)
return 0;
if (a == b)
return a;
if (a > b)
return __gcd(a - b, b);
return __gcd(a, b - a);
}
function solveQuery(arr,n,q,query)
{
let even = new Array(n + 1);
let odd = new Array(n + 1);
even[0] = odd[0] = 0;
for (let i = 0; i < n; i++)
{
if ((arr[i] & 1) > 0)
{
odd[i + 1] = odd[i] + 1;
even[i + 1] = even[i];
}
else
{
even[i + 1] = even[i] + 1;
odd[i + 1] = odd[i];
}
}
for (let i = 0; i < Q; i++)
{
let r = query[i][2];
let l = query[i][1];
let k = query[i][0];
let q = r - l + 1;
let p;
if (k > 0)
p = odd[r] - odd[l - 1];
else
p = even[r] - even[l - 1];
if (p <= 0)
document.write( "0<br>" );
else if (p == q)
document.write( "1<br>" );
else
{
let g = __gcd(p, q);
document.write(p / g
+ " " + q / g+ "<br>" );
}
}
}
let arr=[6, 5, 2, 1, 7];
let n = arr.length;
let Q = 2;
let query = [[0, 2, 2 ],[1, 2, 5]];
solveQuery(arr, n, Q, query);
</script>
|
Time Complexity: O(n)
Auxiliary Space: O(n)
Last Updated :
20 Jul, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...