二进制数组中与1进行异或的区间更新查询
介绍
在本教程中,我们将找到一种方法来查找对二进制数组中与1进行异或的区间更新查询。为了实现这种方法,我们使用一个二进制数组,它是一个由0和1组成的数组。区间更新查询是指用于修改给定区间上下限内的二进制数组的查询。上下限是二进制数组元素的索引。该区间内的元素将使用定义的操作进行更新。
异或是一种位运算,代表“异或”。其基本原理是:如果两个位相同,则结果为0;如果两个位不同,则结果为1。
对于给定的区间,我们考虑对二进制数组执行与1进行异或的5种类型的区间更新查询。这5种类型的区间更新查询如下:
查找二进制数组中某个区间的与1进行异或的结果。
查找二进制数组中某个区间内与1进行异或的最小距离。
查找二进制数组中某个区间内与1进行异或的最大距离。
查找二进制数组中某个区间内与0的最小距离。
查找二进制数组中某个区间内与0的最小距离。
演示
Input = arr[] = {0,1,0,1,1,0,1} Query = 5 OUTPUT = 1 3 2 2
解释
对于输入的二进制数组,使用5个查询来更新区间[2, 5]。
查询1 - 对二进制数组中区间[2, 5]进行与1的异或运算。
与1进行异或后的二进制数组为 {0 1 1 0 0 1 1}。
查询2 - 计算二进制数组中区间[2, 5]内1之间的最小距离。
最小距离为1。
查询3 - 查找二进制数组中区间[2, 5]内1的最大距离。
最大距离为3。
查询4 - 查找二进制数组中区间[2, 5]内与0的最小距离。
最小距离为2。
查询5 - 查找二进制数组中某个区间内与0的最大距离。
最大距离为2。
C++库函数
vector - 它是C++中的动态数组。它在`
`头文件中定义。向量类型在其声明期间由其数据类型定义。
vector<data_type> vector_name;
max() - 它是vector类的预定义函数,在`
`头文件中定义。它返回两个值之间的最大距离。
max(value1, value2);
min() - 它是vector类的预定义函数,在`
`头文件中定义。它返回两个值之间的最小距离。
max(value1, value2);
算法
初始化输入的二进制数组。
初始化查询的区间。
通过迭代指定的区间来查找所有5个查询的输出。
打印所有查询的结果。
示例
我们在C++中实现了问题陈述。我们为每个查询创建单独的用户定义函数。这些函数使用for循环迭代区间,以更新与1进行异或的区间查询。
#include <bits/stdc++.h> using namespace std; int findDistance(const vector<int>& arr, int left, int right, int ans) { int d = INT_MAX; int ansIdx = -1; for (int i = left; i <= right; i++) { if (arr[i] == ans) { if (ansIdx != -1) { d = min(d, i - ansIdx); } else { ansIdx = i; } } } return d; } void operation(vector<int>& arr, int left, int right, int o) { for (int i = left; i <= right; i++) { arr[i] ^= o; } } int main() { vector<int> arr = {0, 1, 0, 1, 1, 0, 1}; int minDistance1 = findDistance(arr, 2, 5, 1); cout << "Min distance between two 1 in range [2, 5]: " << minDistance1 << endl; int maxDistance1 = findDistance(arr, 2, 5, 1); cout << "Max distance between two 1 in range [2, 5]: " << maxDistance1 << endl; int minDistance0 = findDistance(arr, 2, 5, 0); cout << "Min distance between two 0 in range [2, 5]: " << minDistance0 << endl; int maxDistance0 = findDistance(arr, 2, 5, 0); cout << "Max distance between two 0s in range [2, 5]: " << maxDistance0 << endl; operation(arr, 2, 5, 1); cout << "Array after XOR operation with 1 in range [2, 5]: "; for (int num : arr) { cout << num << " "; } cout << endl; return 0; }
输出
Minimum distance between two elements with 1 in range [2, 5]: 1 Maximum distance between two elements with 1 in range [2, 5]: 1 Minimum distance between two elements with 0 in range [2, 5]: 3 Maximum distance between two elements with 0 in range [2, 5]: 3 Array after XOR operation with 1 for range [2, 5]: 0 1 1 0 0 1 1
结论
我们已经完成了本教程关于区间更新查询的讲解。在这里,我们实现了在二进制数组中查找与1进行异或的区间更新查询的问题。使用二进制数组实现了C++逻辑来解决问题陈述。我们在定义二进制数组元素的区间时,使用了5个区间更新查询来与1进行异或。对于每个区间更新查询,用户定义的函数使用“for”循环来迭代索引区间。通过示例演示任务阐述了其含义以及与1进行异或的工作原理。