Count of even sum triplets in the array for Q range queries
Last Updated :
27 Dec, 2021
Given an array arr[] of size N and Q queries of the form (L, R), the task is to count number of triplets with even sum for the elements in the range L and R for each query.
Examples:
Input: N = 6, arr[ ] = {1, 2, 3, 4, 5, 6}, Q[ ] = {{1, 3}, {2, 5}}
Output: 1 2
Explanation:
For Query (1, 3): only triplet (1, 2, 3) exists with even sum
For Query (2, 5): Triplets (2, 3, 5) and (3, 4, 5) have even sum.
Hence the output is 1 and 2 respectively
Input: N = 3, arr[ ] = {1, 2, 5}, Q[ ] = {{1, 2}}
Output: 0
Approach: The above problem can be solved with the observations that for a triplet sum to be even, the elements must be one of the below pattern:
- even + even + even = even
- odd + odd + even = even
Follow the steps below to solve the problem:
- Initialize two arrays, say arr_even[] and arr_odd[] of length size + 1.
- Initialize variables, say even = 0 and odd = 0, to store the count of even and odd numbers.
- Traverse the array arr[] and for each i store even numbers till index i in arr_even[i] and odd numbers till index i in arr_odd[i].
- Iterate over the queries Q[] and for each pair (l, r):
- Find count of even numbers in (l, r) as arr_even[r] – arr_even[l-1] and count of odd numbers in (l, r) as arr_odd[r] – arr_odd[l-1].
- Find count of triplets in variable say ans as sum of (even*(even-1)*(even-2))/6 and (odd*(odd-1)/2)*even.
- Finally, print the ans for each query.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void countTriplets( int size, int queries,
int arr[], int Q[][2])
{
int arr_even[size + 1], arr_odd[size + 1];
int even = 0, odd = 0;
arr_even[0] = 0;
arr_odd[0] = 0;
for ( int i = 0; i < size; i++) {
if (arr[i] % 2) {
odd++;
}
else {
even++;
}
arr_even[i + 1] = even;
arr_odd[i + 1] = odd;
}
for ( int i = 0; i < queries; i++) {
int l = Q[i][0], r = Q[i][1];
int odd = arr_odd[r] - arr_odd[l - 1];
int even = arr_even[r] - arr_even[l - 1];
int ans = (even * (even - 1)
* (even - 2))
/ 6
+ (odd * (odd - 1) / 2)
* even;
cout << ans << " " ;
}
}
int main()
{
int N = 6, Q = 2;
int arr[] = { 1, 2, 3, 4, 5, 6 };
int queries[][2] = { { 1, 3 }, { 2, 5 } };
countTriplets(N, Q, arr, queries);
return 0;
}
|
Java
import java.io.*;
class GFG {
static void countTriplets( int size, int queries,
int [] arr, int [][] Q)
{
int [] arr_even = new int [size + 1 ];
int []arr_odd = new int [size + 1 ];
int even = 0 ;
int odd = 0 ;
arr_even[ 0 ] = 0 ;
arr_odd[ 0 ] = 0 ;
for ( int i = 0 ; i < size; i++) {
if (arr[i] % 2 == 1 ) {
odd++;
}
else {
even++;
}
arr_even[i + 1 ] = even;
arr_odd[i + 1 ] = odd;
}
for ( int i = 0 ; i < queries; i++) {
int l = Q[i][ 0 ], r = Q[i][ 1 ];
odd = arr_odd[r] - arr_odd[l - 1 ];
even = arr_even[r] - arr_even[l - 1 ];
int ans = (even * (even - 1 ) * (even - 2 )) / 6
+ (odd * (odd - 1 ) / 2 ) * even;
System.out.print(ans + " " );
}
}
public static void main(String[] args)
{
int N = 6 , Q = 2 ;
int [] arr = { 1 , 2 , 3 , 4 , 5 , 6 };
int [][] queries = { { 1 , 3 }, { 2 , 5 } };
countTriplets(N, Q, arr, queries);
}
}
|
Python3
def countTriplets(size, queries, arr, Q):
arr_even = [ 0 for i in range (size + 1 )]
arr_odd = [ 0 for i in range (size + 1 )]
even = 0
odd = 0
arr_even[ 0 ] = 0
arr_odd[ 0 ] = 0
for i in range (size):
if (arr[i] % 2 ):
odd + = 1
else :
even + = 1
arr_even[i + 1 ] = even
arr_odd[i + 1 ] = odd
for i in range (queries):
l = Q[i][ 0 ]
r = Q[i][ 1 ]
odd = arr_odd[r] - arr_odd[l - 1 ]
even = arr_even[r] - arr_even[l - 1 ]
ans = (even * (even - 1 ) * (even - 2 )) / / 6 + (odd * (odd - 1 ) / / 2 ) * even
print (ans,end = " " )
if __name__ = = '__main__' :
N = 6
Q = 2
arr = [ 1 , 2 , 3 , 4 , 5 , 6 ]
queries = [[ 1 , 3 ],[ 2 , 5 ]]
countTriplets(N, Q, arr, queries)
|
C#
using System;
class GFG
{
static void countTriplets( int size, int queries,
int [] arr, int [, ] Q)
{
int [] arr_even = new int [size + 1];
int [] arr_odd = new int [size + 1];
int even = 0;
int odd = 0;
arr_even[0] = 0;
arr_odd[0] = 0;
for ( int i = 0; i < size; i++) {
if (arr[i] % 2 == 1) {
odd++;
}
else {
even++;
}
arr_even[i + 1] = even;
arr_odd[i + 1] = odd;
}
for ( int i = 0; i < queries; i++) {
int l = Q[i, 0], r = Q[i, 1];
odd = arr_odd[r] - arr_odd[l - 1];
even = arr_even[r] - arr_even[l - 1];
int ans = (even * (even - 1) * (even - 2)) / 6
+ (odd * (odd - 1) / 2) * even;
Console.Write(ans + " " );
}
}
public static void Main()
{
int N = 6, Q = 2;
int [] arr = { 1, 2, 3, 4, 5, 6 };
int [, ] queries = { { 1, 3 }, { 2, 5 } };
countTriplets(N, Q, arr, queries);
}
}
|
Javascript
<script>
function countTriplets(size, queries, arr, Q)
{
let arr_even = new Array(size + 1);
let arr_odd = new Array(size + 1);
let even = 0;
let odd = 0;
arr_even[0] = 0;
arr_odd[0] = 0;
for (let i = 0; i < size; i++) {
if (arr[i] % 2 == 1) {
odd++;
}
else {
even++;
}
arr_even[i + 1] = even;
arr_odd[i + 1] = odd;
}
for (let i = 0; i < queries; i++) {
let l = Q[i][0], r = Q[i][1];
odd = arr_odd[r] - arr_odd[l - 1];
even = arr_even[r] - arr_even[l - 1];
let ans = (even * (even - 1) * (even - 2)) / 6
+ (odd * (odd - 1) / 2) * even;
document.write(ans + " " );
}
}
let N = 6, Q = 2;
let arr = [ 1, 2, 3, 4, 5, 6 ];
let queries = [[ 1, 3 ], [ 2, 5 ]];
countTriplets(N, Q, arr, queries);
</script>
|
Time Complexity: O(N*Q)
Auxiliary Space: O(N)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...