使用C++查询给定数组在索引范围内的按位或操作

使用c++查询给定数组在索引范围内的按位或操作

在本文中,我们给出了一个整数数组。我们的任务是找到给定范围内所有数字的按位或,例如,

Input: arr[] = {1, 3, 1, 2, 3, 4}, q[] = {{0, 1}, {3, 5}}Output:371 OR 3 = 32 OR 3 OR 4 = 7Input: arr[] = {1, 2, 3, 4, 5}, q[] = {{0, 4}, {1, 3}}Output:77

在给定的问题中,我们将使用强力方法来解决它,然后检查它是否可以适用于更高的约束。如果没有,那么我们将优化我们的方法以适应更高的约束。

暴力方法

在这种方法中,我们只需遍历每个范围并计算按位或该范围内的所有数字并打印我们的答案。

示例

#include using namespace std;int main() {   int arr[] = { 7, 5, 3, 5, 2, 3 };   int n = sizeof(arr) / sizeof(int); // size of our array   int queries[][2] = { { 1, 3 }, { 4, 5 } }; // given queries   int q = sizeof(queries) / sizeof(queries[0]); // number of queries   for(int i = 0; i < q; i++) { // traversing through all the queries      long ans = 0;      for(int j = queries[i][0]; j <= queries[i][1]; j++) // traversing through the range         ans |= arr[j]; // calculating the answer      cout << ans << "n";   }   return 0;}

输出

73

这种方法的时间复杂度为 O(N*Q),其中 N 是数组的大小,Q 是现在的查询数量,如您所见,这种复杂性不适用于更高的约束,所以现在我们将优化我们的方法,使其也适用于更高的约束。

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

高效方法

在这种方法中,我们将计算前缀位数,然后检查是否数字有一个特定的位集。如果是,那么我们将这一点放入答案中;否则,我们保留这一点。

示例

#include using namespace std;#define bitt 32#define MAX (int)10e5int prefixbits[bitt][MAX];void bitcount(int *arr, int n) { // making prefix counts   for (int j = 31; j >= 0; j--) {      prefixbits[j][0] = ((arr[0] >> j) & 1);      for (int i = 1; i < n; i++) {         prefixbits[j][i] = arr[i] & (1LL << j);         prefixbits[j][i] += prefixbits[j][i - 1];      }   }   return;}int check(int l, int r) { // calculating the answer   long ans = 0; // to avoid overflow we are taking ans as long   for (int i = 0; i < 32; i++) {      int x;      if (l == 0)         x = prefixbits[i][r];      else         x = prefixbits[i][r] - prefixbits[i][l - 1];      if (x != 0)         ans = (ans | (1LL << i));   }   return ans;}int main() {   int arr[] = {7, 5, 3, 5, 2, 3};   int n = sizeof(arr) / sizeof(int); // size of our array   bitcount(arr, n);   int queries[][2] = {{1, 3}, {4, 5}}; // given queries   int q = sizeof(queries) / sizeof(queries[0]); // number of queries   for (int i = 0; i < q; i++) {      cout << check(queries[i][0], queries[i][1]) << "n";   }   return 0;}

输出

73

此方法的时间复杂度为 O(N),其中 N 是数组的大小,因此此方法可以适用于更高的约束。

说明上面的代码

在这种方法中,我们计算前缀位数并存储它。现在我们计算一个查询,我们遍历该前缀计数并删除 l-1 的位计数,这样我们就有 [l, r] 范围内数字的位计数,因为我们知道如果在任何数字中设置了一个位因此,如果您将其与任何其他数字进行按位或,则该位将保持设置状态,因此使用按位或的此属性,我们检查位计数是否不为零,这意味着范围内存在具有设置位的数字,因此我们设置该位答案并继续循环,最后打印答案。

结论

本文解决了计算索引范围 [L, R] 中按位或的查询的问题给定的数组。我们还学习了解决这个问题的C++程序以及解决这个问题的完整方法(正常且高效)。我们可以用其他语言比如C、java、python等语言来编写同样的程序。我们希望这篇文章对您有所帮助。

以上就是使用C++查询给定数组在索引范围内的按位或操作的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 22:42:13
下一篇 2025年12月9日 05:54:22

相关推荐

  • 检查是否可以通过交换字符使数组中的所有字符串相同

    在本文中,我们将探讨通过交换字符来检查数组中的所有字符串是否相同的问题。我们将首先理解问题陈述,然后研究解决该问题的简单和有效的方法,以及它们各自的算法和时间复杂度。最后,我们将用 C++ 实现该解决方案。 问题陈述 给定一个字符串数组,确定是否可以通过交换字符使所有字符串都相同。 天真的方法 最简…

    2025年12月17日
    000
  • 一个C/C++指针谜题?

    假设我们有一个整型变量,其大小为 4 字节,还有另一个指针变量,其大小为 8 字节。那么下面的输出会是什么? 示例 #includeusing namespace std;main() { int a[4][5][6]; int x = 0; int* a1 = &x; int** a2 =…

    2025年12月17日
    000
  • 使用C++删除链表的第一个节点

    给定一个链表,我们需要删除它的第一个元素并将指针返回到新链表的头部。 Input : 1 -> 2 -> 3 -> 4 -> 5 -> NULLOutput : 2 -> 3 -> 4 -> 5 -> NULLInput : 2 -> 4 …

    2025年12月17日
    000
  • c语言中null和NULL的区别是什么

    c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。 在C语言中,”null&…

    2025年12月17日
    000
  • 在C语言中,命令行参数是指在程序运行时通过命令行传递给程序的参数

    执行操作系统任务的可执行指令称为命令。这些命令是从操作系统的提示符中发出的。 与命令相关联的参数如下: argc – 参数计数。 argv – 参数向量。 立即学习“C语言免费学习笔记(深入)”; argc – 它保存从命令提示符传递的参数总数。 argv &#8…

    2025年12月17日
    000
  • 在C语言中,pthread_equal()函数用于比较两个线程ID是否相等

    pthread_equal()函数用于检查两个线程是否相等。它返回0或非零值。对于相等的线程,它将返回非零值,否则返回0。该函数的语法如下: int pthread_equal (pthread_t th1, pthread_t th2); 现在让我们看看 pthread_equal() 的实际作用…

    2025年12月17日
    000
  • 如何在C语言中将结构体的各个成员作为参数传递给函数?

    将各个成员作为参数传递给函数 – 每个成员都作为函数调用中的参数传递。 它们在函数头中的普通变量中独立收集。 示例 #include//Declaring structure//struct student{ int s1,s2,s3;}s[5];//Declaring and retu…

    2025年12月17日
    000
  • 在C语言中编写一个程序,用于检查给定的年份是否为闰年

    闰年有366天,而普通年有365天,任务是通过程序检查给定的年份是否为闰年。 判断的逻辑可以通过检查年份是否能被400或4整除来实现,但如果不能被这两个数整除,则为普通年。 示例 Input-: year=2000Output-: 2000 is a Leap YearInput-: year=10…

    2025年12月17日
    000
  • 在C++中,将以下内容翻译为中文:寻找下一个较小的元素

    下一个较小的元素是其后第一个较小元素的元素。让我们看一个例子。 arr = [1, 2, 3, 5, 4] 5 的下一个较小元素是 4,元素 1、2 的下一个较小元素是, 3 为 -1,因为它们后面没有更小的元素。 算法 用随机数初始化数组 立即学习“C++免费学习笔记(深入)”; 初始化堆栈。 将…

    2025年12月17日
    000
  • 在C语言中,打印已排序的数组中的不重复元素

    给定一个整数元素的数组,任务是删除重复的值并以排序的方式打印出不同的元素。 下面给出了一个以4、6、5、3、4、5、2、8、7和0的顺序存储整数类型值的数组,现在,结果将以0、2、3、4、4、5、5、6、7和8的顺序打印出排序的元素,但是这个结果仍然包含重复的值4和5,应该将它们删除,最终的结果将是…

    2025年12月17日
    000
  • 使用C++找到数组中的正负值对

    在本文中,我们有一个包含不同元素的数组。我们需要打印数组中具有相同绝对值的正负值对,并按排序顺序打印它们,例如 – Input : arr[] = { 1, -1, 11, 12, 56, 77, -56, -12, -88}Output : -1 1 -12 12 -56 56Inpu…

    2025年12月17日
    000
  • 在C语言中需要使用长整型数据类型

    在 C 或 C++ 中,有四种不同的数据类型用于整数类型数据。这四种数据类型是short、int、long 和long long。每种数据类型占用不同的内存空间。大小在不同的体系结构和不同的操作系统中有所不同。有时 int 需要 4 个字节,有时需要 2 个字节。编译器也会发生这种情况。所以我们可以…

    2025年12月17日
    000
  • 在C语言中,pthread_self()的意思是获取当前线程的ID

    这里我们看看C语言中pthread_self()的作用是什么。pthread_self()函数用于获取当前线程的ID。该函数可以唯一标识现有的线程。但如果有多个线程,并且有一个线程完成,那么该 id 就可以重用。因此,对于所有正在运行的线程,id 都是唯一的。 示例 #include #includ…

    2025年12月17日
    000
  • 如何在C语言中计算可变数量的参数?

    在本节中,我们将了解在 C 中参数数量可变的情况下如何计算参数数量。 C 支持省略号。这用于将可变数量的参数传递给函数。用户可以使用三种不同方式之一对参数进行计数。 通过传递第一个参数作为参数计数 将最后一个参数作为 NULL 传递。 立即学习“C语言免费学习笔记(深入)”; 使用 printf()…

    2025年12月17日
    000
  • C++程序,用于计算数组元素大于其左侧所有元素且至少有K个元素在其右侧的数量

    字符串是一个对象,它表示数据字符的序列。字符串是始终表示为文本格式的数据容器。它还用于概念、比较、拆分、连接、替换、修剪、长度、实习、等于、比较、子字符串操作。使用快速排序分区算法的数组中的 K 个最大(或最小)元素。 这是一个数组 R[],其中包含 N 个不同的整数。任务是找到那个特定元素,该元素…

    2025年12月17日
    000
  • 在C语言中,fork()函数

    在本节中,我们将了解C语言中的fork系统调用。这个fork系统调用用于创建一个新的进程。这个新创建的进程被称为子进程。创建另一个子进程的当前进程被称为父进程。 子进程使用相同的程序计数器、CPU寄存器和父进程使用的相同文件。 fork()函数不接受任何参数,它返回整数值。它可能返回三种类型的整数值…

    2025年12月17日
    000
  • 在C语言中,字符串中任意两个相同字符之间的最大字符数

    我们得到一个字母字符串。数组中至少会有两个相同字符的出现。这里的任务是找到任意两个相同字符之间的最大字符数。如果没有任何字符的重复,则返回-1。 输入 – 字符串 str = “abcdba” 输出 – 字符串中任意两个相同字符之间的最大字符数 &#8…

    2025年12月17日
    000
  • 以C语言的迭代方法,将链表的最后k个节点以相反的顺序打印出来

    我们必须以相反的顺序打印链表的 k 个节点。我们必须应用迭代方法来解决这个问题。 迭代方法通常使用循环执行,直到条件值为 1 或 true。 比方说, list 包含节点 29, 34, 43, 56 和 88,k 的值为 2,输出将是直到 k 的备用节点,例如 56 和 88。 立即学习“C语言免…

    2025年12月17日
    000
  • 在C语言中,一个进程内可以创建的最大线程数

    给定的任务是在一个进程中找到可以创建的最大线程数 C. 线程是轻量级进程,可以由调度程序独立管理。因为一个线程是进程的一个组件,因此可以关联多个线程 线程相对于进程而言,不仅处理起来更轻便,而且上下文切换所需时间更短。 线程所需的资源较进程少,并且它们还与其同级共享内存。 线程。所有用户级对等线程都…

    2025年12月17日
    000
  • 使用归并排序算法编写的C/C++程序来计算数组中的逆序对数?

    对给定数组进行排序时发生的反转计数称为反转计数。逆问题是一个经典问题,可以使用归并排序算法来解决。在此问题 v 中,我们将计算其左侧大于它的所有元素,并将计数添加到输出。这个逻辑是在合并排序的合并函数中完成的。 为了更好地理解这个主题,让我们举一个例子。让我们考虑合并过程中涉及的两个子数组 &#82…

    2025年12月17日 好文分享
    000

发表回复

登录后才能评论
关注微信