📌  相关文章
📜  在增量后计数大于等于 x 的值

📅  最后修改于: 2022-05-13 01:57:52.722000             🧑  作者: Mango

在增量后计数大于等于 x 的值

考虑一个大小为 n 且初始值为 0 的数组。在执行 m 范围更新后,有多少索引将包含至少 x 的值?在他们的每个查询中,您都获得了从 L 到 R 的范围,并且您必须将 1 添加到从 L 到 R(包括两者)开始的每个索引。现在,给您 q 个查询,并且在每个查询中,有一个数字 x。你的任务是找出有多少数组索引大于或等于 x。 (n、m、q的值最高可达10^6)

例子:

Input :  n = 4
         l[] = {1, 1, 3};
         r[] = {3, 2, 4};         
         x[] = {1, 4, 2};
Output :
Number of indexes with atleast 1 is 4
Number of indexes with atleast 4 is 0
Number of indexes with atleast 2 is 3

Explanation :
Initial array is {0, 0, 0, 0}
After first update : {1, 1, 1, 0}
After second update : {2, 2, 1, 0}
After third update : {2, 2, 2, 1} 

天真的方法:想到的简单解决方案是创建一个大小为 n 的数组,并为每次更新 [L, R] 将 1 添加到此范围内的每个数组索引。然后,对于每个 x,通过遍历整个数组来计算值大于或等于 x 的索引的数量。但是,给定 n 和 q 的值非常大(最多 10^6),因此对于每个查询,我们不能简单地遍历数组并找出有多少索引至少有 x 作为它们的值。在最坏的情况下,复杂度为 O(nq),效率非常低。

高效方法:想法是首先通过累积所有增量来计算数组的值(我们使用与本文相同的技术)。找到元素后,我们找到每个元素的频率。然后我们通过从右到左遍历来计算更大元素的频率。最后,我们可以在 O(1) 时间内回答所有查询。

C++
// C++ code to count element
// with values at least x.
#include
using namespace std;
 
// For every query in x[0..q-1], count of values
// greater than or equal to query value are printed.
void coutIndices(int n, int l[], int r[], int m,
                 int x[], int q)
{
    // Start and end store frequencies of all
    // starting and ending points
    int start[n+1] = {0};
    int End[n+1] = {0};
    for (int i = 0; i < m; i++)
    {
        start[l[i]] += 1;
        End[r[i]] += 1;
    }
 
    // Find actual array values after m queries
    int compute[n+1] = {0};
    compute[1] = start[1];
    for (int i = 1; i <= n; i++)
        compute[i] =  compute[i - 1] + start[i] -
                      End[i - 1];
 
    // Find frequency of every element in compute[]
    int max = *max_element(compute, compute+n+1);
    int freq[max+1] = {0};
    for (int i=1; i<=n; i++)
        freq[compute[i]]++;
 
    // reverse cumulative sum of the freq array
    // because of atleast value of array
    // indices for each possible x
    for (int i = max-1; i >= 0; i--)
        freq[i] += freq[i + 1];
 
    // Solving queries
    for (int i = 0; i < q; i++)
    {
        cout << "number of indexes with atleast " <<
             x[i] << " is ";
        if (x[i] > max)
            cout << 0 << "\n";
        else
            cout << freq[x[i]] << endl;
    }
}
 
// Driver code
int main()
{
    // Number of elements in an array
    // with all initial 0 values
    int n = 7;
 
    // Subarrays that need to be incremented
    int l[] = {1, 2, 1, 5};
    int r[] = {3, 5, 2, 6};
 
    // Query values
    int x[] = {1, 7, 4, 2};
 
    int m = sizeof(l)/sizeof(l[0]);
    int q = sizeof(x)/sizeof(x[0]);
    coutIndices(n, l, r, m, x, q);
 
    return 0;
}


Java
// Java code to count element
// with values at least x.
import java.io.*;
import java.util.*;
 
class GFG
{
     
// For every query in x[0..q-1],
// count of values greater than
// or equal to query value are
// printed.
static void coutIndices(int n, int l[],
                        int r[], int m,
                        int x[], int q)
{
    // Start and end store
    // frequencies of all
    // starting and ending points
    int []start = new int[n + 1];
    int End[] = new int[n + 1];
     
    for (int i = 0; i < m; i++)
    {
        start[l[i]] += 1;
        End[r[i]] += 1;
    }
 
    // Find actual array
    // values after m queries
    int compute[] = new int[n + 1];
    compute[1] = start[1];
    for (int i = 1; i <= n; i++)
        compute[i] = compute[i - 1] +
                           start[i] -
                           End[i - 1];
 
    // Find frequency of every
    // element in compute[]
    Arrays.sort(compute);
    int max = compute[n];
    int freq[] = new int[max + 1];
     
    for (int i = 1; i <= n; i++)
        freq[compute[i]]++;
 
    // reverse cumulative sum of
    // the freq array because of
    // atleast value of array
    // indices for each possible x
    for (int i = max - 1; i >= 0; i--)
        freq[i] += freq[i + 1];
 
    // Solving queries
    for (int i = 0; i < q; i++)
    {
        System.out.print("number of indexes " +
                               "with atleat " +
                                x[i] + " is ");
        if (x[i] > max)
            System.out.println("0");
        else
            System.out.println(freq[x[i]]);
    }
}
 
// Driver code
public static void main (String[] args)
{
     
// Number of elements in
// an array with all
// initial 0 values
int n = 7;
 
// Subarrays that need
// to be incremented
int l[] = {1, 2, 1, 5};
int r[] = {3, 5, 2, 6};
 
// Query values
int x[] = {1, 7, 4, 2};
 
int m = l.length;
int q = x.length;
coutIndices(n, l, r, m, x, q);
}
}
 
// This code has been
// contributed by anuj_67.


Python3
# Python 3 code to count element with
# values at least x.
 
# For every query in x[0..q-1], count
# of values greater than or equal to
# query value are printed.
def coutIndices(n, l, r, m, x, q):
     
    # Start and end store frequencies
    # of all starting and ending points
    start = [0 for i in range(n + 1)]
    End = [0 for i in range(n + 1)]
    for i in range(0, m, 1):
        start[l[i]] += 1
        End[r[i]] += 1
 
    # Find actual array values
    # after m queries
    compute = [0 for i in range(n + 1)]
    compute[1] = start[1]
    for i in range(1, n + 1, 1):
        compute[i] = (compute[i - 1] +
                      start[i] - End[i - 1])
 
    # Find frequency of every
    # element in compute[]
    max = compute[0]
    for i in range(len(compute)):
        if(compute[i] > max):
            max = compute[i]
 
    freq = [0 for i in range(max + 1)]
    for i in range(1, n + 1, 1):
        freq[compute[i]] += 1
 
    # reverse cumulative sum of the freq
    # array because of atleast value of
    # array indices for each possible x
    i = max - 1
    while(i >= 0):
        freq[i] += freq[i + 1]
        i -= 1
 
    # Solving queries
    for i in range(0, q, 1):
        print("number of indexes with atleat",
                        x[i], "is", end = " ")
        if (x[i] > max):
            print(0)
        else:
            print(freq[x[i]])
 
# Driver code
if __name__ == '__main__':
     
    # Number of elements in an array
    # with all initial 0 values
    n = 7
 
    # Subarrays that need to be incremented
    l = [1, 2, 1, 5]
    r = [3, 5, 2, 6]
 
    # Query values
    x= [1, 7, 4, 2]
 
    m = len(l)
    q = len(x)
    coutIndices(n, l, r, m, x, q);
 
# This code is contributed by
# Sahil_Shelangia


C#
// C# code to count element
// with values at least x.
using System;
 
class GFG
{
     
// For every query in x[0..q-1],
// count of values greater than
// or equal to query value are
// printed.
static void coutIndices(int n, int []l,
                        int []r, int m,
                        int []x, int q)
{
    // Start and end store
    // frequencies of all
    // starting and ending points
    int []start = new int[n + 1];
    int []End = new int[n + 1];
     
    for (int i = 0; i < m; i++)
    {
        start[l[i]] += 1;
        End[r[i]] += 1;
    }
 
    // Find actual array
    // values after m queries
    int []compute = new int[n + 1];
    compute[1] = start[1];
    for (int i = 1; i <= n; i++)
        compute[i] = compute[i - 1] +
                       start[i] -
                         End[i - 1];
 
    // Find frequency of every
    // element in compute[]
    Array.Sort(compute);
    int max = compute[n];
    int []freq = new int[max + 1];
     
    for (int i = 1; i <= n; i++)
        freq[compute[i]]++;
 
    // reverse cumulative sum of
    // the freq array because of
    // atleast value of array
    // indices for each possible x
    for (int i = max - 1; i >= 0; i--)
        freq[i] += freq[i + 1];
 
    // Solving queries
    for (int i = 0; i < q; i++)
    {
        Console.Write("number of indexes " +
                            "with atleat " +
                             x[i] + " is ");
        if (x[i] > max)
            Console.WriteLine("0");
        else
            Console.WriteLine(freq[x[i]]);
    }
}
 
// Driver code
public static void Main ()
{
     
// Number of elements in
// an array with all
// initial 0 values
int n = 7;
 
// Subarrays that need
// to be incremented
int []l = {1, 2, 1, 5};
int []r = {3, 5, 2, 6};
 
// Query values
int []x = {1, 7, 4, 2};
 
int m = l.Length;
int q = x.Length;
coutIndices(n, l, r, m, x, q);
}
}
 
// This code has been
// contributed by anuj_67.


Javascript


输出:

number of indexes with atleast 1 is 6
number of indexes with atleast 7 is 0
number of indexes with atleast 4 is 0
number of indexes with atleast 2 is 4