使用C++编写的查询在范围内具有第K位设置的数组元素数量的代码

使用c++编写的查询在范围内具有第k位设置的数组元素数量的代码

在本文中,我们将讨论一个问题,即找到给定范围内具有第k位设置的元素的数量,例如 −

Input : arr[] = { 4, 5, 7, 2 }Query 1: L = 2, R = 4, K = 4Query 2: L = 3, R = 5, K = 1Output :   0   1

我们将通过一种蛮力的方法来解决这个问题,并看看这种方法是否适用于更高的约束条件。如果不适用,那么我们尝试思考一种新的高效方法。

蛮力方法

在这种方法中,我们只需遍历范围并检查每个元素的第k位是否设置,如果是,则增加计数。

示例

#includeusing namespace std;#define MAX_BITS 32bool Kset(int n, int k) { // to check if kth bit is set   if (n & (1 << (k - 1)))   return true;   return false;}int query(int L, int R, int K, int arr[]) {   int count = 0; // counter to keep count of number present in the range   for (int i = L; i <= R; i++) { // traversing the range      if (Kset(arr[i], K)) {         count++;      }   }   return count;}int main() {   int arr[] = { 4, 5, 7, 2 }; // given array   int n = sizeof(arr) / sizeof(arr[0]); // size of our array   int queries[][3] = { // given L, R and k      { 2, 4, 4 },      { 3, 5, 1 }   };   int q = sizeof(queries) / sizeof(queries[0]); // number of queries   for (int i = 0; i < q; i++) {      int L = queries[i][0] - 1;      int R = queries[i][1] - 1;      int K = queries[i][2];      cout << query(L, R, K, arr) << "n";   }   return 0;}

输出

01

上述方法的时间复杂度为O(N*Q),其中N是数组的大小,Q是给定的查询数量;如您所见,这种方法对于更高的约束条件不适用,因为它将花费太多时间,所以现在我们将尝试制作一个高效的程序。

立即学习“C++免费学习笔记(深入)”;

高效的方法

在这种方法中,我们将维护一个二维前缀和数组,该数组将保持每个索引位置使用的位数,并且我们可以在O(1)的复杂度中计算出答案。

示例

#includeusing namespace std;#define bits 32 // number of bitsint P[100000][bits+1];bool Kset(int n, int k) {   if (n & (1 << (k - 1)))      return true;   return false;}void prefixArray(int n, int arr[]) { // building the prefix array   for (int i = 0; i <= bits; i++) {      P[0][i] = 0; // setting every bits initial count = 0   }   for (int i = 0; i < n; i++) {      for (int j = 1; j <= bits; j++) {         bool flag = Kset(arr[i], j);         if (i) // we add previous count to the latest count(0)            P[i][j] = P[i - 1][j];         if (flag) { // if jth bit is set so we increase the count            P[i][j]++;         }      }   }}int query(int L, int R, int K) {   if (L) // if L not equal to 0 then we return the prefix at R subtracted with prefix at L-1      return P[R][K] - P[L - 1][K];   else      return P[R][K];}int main() {   int arr[] = { 8, 9, 1, 3 }; // given array   int n = sizeof(arr) / sizeof(arr[0]); // size of given array   int queries[][3] = {      { 1, 3, 4 },      { 2, 4, 1 }   };   prefixArray(n, arr); // calling the function to create prefix array   int q = sizeof(queries) / sizeof(queries[0]); // number of queries   for (int i = 0; i < q; i++) {      int L = queries[i][0] - 1;      int R = queries[i][1] - 1;      int K = queries[i][2];      cout << query(L, R, K) << "n";   }   return 0;}

输出

23

由于我们正在维护帮助我们以O(1)的时间复杂度找到答案的前缀数组,所以我们的时间复杂度大大降低到了O(N),其中N是给定数组的大小。

上述代码的解释

在这个程序中,我们为数组的每个索引维护一个前缀计数器,用于计算该索引之前使用的每个位数。现在,我们已经存储了每个位数的前缀计数,所以对于第k位的计数,我们需要用第R索引处的第k位的前缀计数减去第L-1索引处的第k位的前缀计数,这就是我们的答案。

结论

在本文中,我们解决了一个问题,即解决具有第K位设置的范围内数组元素的查询。我们还学习了这个问题的C++程序以及我们解决这个问题的完整方法(普通和高效)。我们可以用其他语言(如C、Java、Python和其他语言)编写相同的程序。希望您会觉得这篇文章有帮助。

以上就是使用C++编写的查询在范围内具有第K位设置的数组元素数量的代码的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1444232.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 21:14:30
下一篇 2025年12月17日 21:14:37

相关推荐

  • 回文子字符串查询在C++中

    在本教程中,我们需要解决给定字符串的回文子串查询。解决回文子串查询比解决 C++ 中的常规查询复杂得多。它需要更复杂的代码和逻辑。 在本教程中,我们提供了字符串 str 和 Q 个子字符串 [L…R] 查询,每个查询都有两个值 L 和 R。我们的目标编写一个程序来解决查询以确定 subs…

    2025年12月17日
    000
  • 使用C++编程,找到停靠站的数量

    x 点和 y 点之间有 n 个中间火车站。计算可以安排火车在 s 个车站停靠的不同方式的数量,使得没有两个车站彼此相邻。因此,在本文中,我们将解释各种可能的方法来找出停靠站的数量。看看这个问题,我们可以发现我们需要找到可以让火车在 s 个站点停靠的组合。 解决问题的方法 让我们举个例子:有八个中间站…

    2025年12月17日
    000
  • 在一个范围内的所有可能的互质不同元素对是什么?

    在这里,我们将看到如何计算在范围内的互质数对的数量,其中一个数不会出现多于一对。 在讨论逻辑之前,让我们看看什么是互质数?互质数是那些只有一个正整数约数(即1)的数。换句话说,我们可以说这两个数的最大公约数是1。 在这里,我们提供了下限和上限。如果下限和上限分别为1和6,那么有三对数。它们是(1,2…

    2025年12月17日
    000
  • 在C编程中,算术平均数

    算术平均值是一组数字的总和除以该集合中数字的数量。 算术平均值的基本属性 n 个数字 x1、x2、. 的平均值。 。 .,xn 是 x。如果每个观测值增加 p,则新观测值的平均值为 (x + p)。 n 数字 x1, x2, . 。 .,xn 是 x。如果每个观测值减少 p,则新观测值的平均值为 (…

    2025年12月17日
    000
  • 使用C++编写在K级中,以N级的最大功率战胜A级boss,使得功率增加B

    在游戏开发领域,优化玩家能力和进度是创造引人入胜且具有挑战性的体验的一个重要方面。一种常见的机制涉及击败不同级别的头目,每次胜利都会赋予玩家力量增加。在本文中,我们将探讨如何计算玩家在给定初始功率级别 K 的 N 个级别中可以实现的最大功率,同时考虑通过击败 A[i 级别的 Boss)获得的功率增量…

    2025年12月17日
    000
  • 在C编程中,静态内存分配是什么意思?

    内存可以通过以下两种方式分配: 静态内存分配 静态变量定义在一个分配的空间块中,大小固定。一旦分配,就不能释放。 程序中为声明的变量分配内存。 可以使用“&”运算符获取地址并赋给指针。 内存在编译时分配。 它使用堆栈来维护内存的静态分配。 在这种分配中,一旦分配了内存,内存大小就不能改变。 …

    2025年12月17日
    000
  • 在C编程中,在运行时使用二维数组进行工作

    问题 编写一个C程序,使用运行时编译来计算二维数组中所有元素的和与积。 解决方案 运行时编译或初始化也称为动态分配。在执行时(运行时)分配内存称为动态内存分配。 函数calloc()和malloc()支持动态内存分配。 函数calloc()和malloc()支持动态内存分配。 p> 在这个程序…

    2025年12月17日
    000
  • 使用C++编写,找到满足方程的六元组的数量

    在本文中,我们将描述一种寻找满足方程的六元组的方法。因此,我们以一个方程为例,需要找到满足下面方程的a、b、c、d、e和f的值。 ( a + b + c ) * e / d = f 让我们重新排序方程 − ( a + b + c ) = ( f * d ) / e 这是给定问题的一个简单示例 &#8…

    2025年12月17日
    000
  • C编程求和序列2、22、222、……的代码

    给定一个序列:2,22,222,2222……,我们需要找到这个序列的和。因此,我们必须寻找用于求级数之和的数学公式, 公式的解释是这样的 – sum =[2+22+222+2222….]sum= 2*[1+11+111+1111….]S…

    2025年12月17日
    000
  • 使用C++编程,找出具有m个奇数的子数组的数量

    如果你曾经使用过C++,你一定知道什么是子数组以及它们有多么有用。众所周知,在 C++ 中,我们可以轻松解决多个数学问题。因此,在本文中,我们将解释如何在 C++ 中借助这些子数组找到 M 个奇数的完整信息。 在这个问题中,我们需要找到由给定数组组成的许多子数组和整数 m,其中每个子数组恰好包含 m…

    2025年12月17日
    000
  • 编写一个在C编程中返回输入为1时返回2,输入为2时返回1的函数

    需要制作一个函数,对于输入1返回2,对于输入2返回1。根据您使用的逻辑,可以以多种方式制作此函数。最简单的方法是使用条件语句,如果数字是1,则返回2,否则返回1,其他方法包括使用数学运算(任何一种都可以)和异或运算。 示例 #include // Method 1 using the if stat…

    2025年12月17日
    000
  • 查询以更新的矩阵中连接的非空单元格的数量

    矩阵可以被认为是按行和列组织的单元格的集合。每个单元格可以包含一个值,该值可以为空或非空。在计算机编程中,矩阵通常用于表示二维网格中的数据。 在本文中,我们将讨论如何有效地计算矩阵中连接的非空单元格的数量,同时考虑到矩阵可能的更新。我们将探索解决此问题的不同方法,并提供真实的代码示例来演示实现。 语…

    2025年12月17日
    000
  • 使用C++编写,在矩阵中找到给定和的一对数字

    在本文中,我们将讨论在给定矩阵中查找具有给定和的对的程序。例如 – Input : matrix[n][m] = { { 4, 6, 4, 65 }, { 56, 1, 12, 32 }, { 4, 5, 6, 44 }, { 13, 9, 11, 25 } }, SUM = 20Out…

    2025年12月17日
    000
  • 使用C++编写的至少包含一个非空子数组的按位与的数字

    为了解决给定一个数组的问题,我们需要找到所有可能的整数,这些整数至少是一个非空子数组的按位与,例如 – Input : nums[ ] = { 3, 5, 1, 2, 8 }Output : { 2, 5, 0, 3, 8, 1 }Explanation:2 is the bitwise…

    2025年12月17日
    000
  • 使用C++编写的数组右旋转的反转算法

    在本文中,我们将了解逆转算法,将给定的数组向右旋转k个元素,例如 − Input : arr[ ] = { 4, 6, 2, 6, 43, 7, 3, 7 }, k = 4Output : { 43, 7, 3, 7, 4, 6, 2, 6 }Explanation : Rotating each …

    2025年12月17日
    000
  • 使用C++编程找到可能的直角三角形的斜边和面积的配对数量

    在本文中,我们将解释如何在 C++ 中求解形成直角三角形的斜边和面积的可能对的数量。 我们需要确定 a 的所有可能对的数量斜边和面积 ( H, A ) 形成一个直角三角形,其中 H 为斜边,A 为面积。 在此示例中 –          x = 直角三角形的底 立即学习“C++免费学习笔…

    2025年12月17日
    000
  • 在C++中,通过将数组的前缀与-1相乘来最大化数组的和

    我们有一个整数数组,任务是首先获取数组的前缀,然后将其乘以-1,其次计算数组的前缀和,最后找到生成的前缀数组中的最大和。 前缀数组生成如下: 前缀数组的第一个元素prefixArray[0] = 数组的第一个元素 前缀数组的第二个元素prefixArray[1] = prefixArray[0] +…

    2025年12月17日
    000
  • 如何使用C++在OpenCV中旋转视频?

    旋转视频与旋转图像类似。唯一的区别是我们不是将静态图片加载到图像矩阵中,而是加载了视频或从相机获取视频流。 这里,我们不是加载视频,而是使用相机拍摄视频。如果要使用视频文件,只需正确输入视频文件的地址即可。 以下程序演示了如何使用C++在OpenCV中旋转视频。 示例 H2> #include…

    2025年12月17日
    000
  • 使用C++编写,找到和小于K的子数组的数量

    在这篇文章中,我们将使用C++找出具有小于K的和的子数组的数量。在这个问题中,我们有一个数组arr[]和一个整数K。现在我们需要找出和小于K的子数组。以下是示例 − Input : arr[] = {1, 11, 2, 3, 15}K = 10Output : 4{1}, {2}, {3} and …

    2025年12月17日
    000
  • 使用C++找到数组中唯一配对的数量

    我们需要适当的知识才能在 C++ 的数组语法中创建几个唯一的对。在查找唯一对的数量时,我们计算给定数组中的所有唯一对,即可以形成所有可能的对,其中每个对应该是唯一的。例如 – Input : array[ ] = { 5, 5, 9 }Output : 4Explanation : Th…

    2025年12月17日
    000

发表回复

登录后才能评论
关注微信