给定数组arr []并以(l,r,val)形式查询Q [] [] ,每个查询的任务是将索引[l – 1,r – 1]中的所有元素更新为按位与val进行XOR。完成所有查询后,打印最终获得的数组。
例子:
Input: arr[] = {2, 3, 6, 5, 4}, Q[][] = {{1, 3, 2}, {2, 4, 4}}
Output: 0 5 0 1 4
Explanation:
1st Query: Concerned subarray {2, 3, 6} modifies to {0, 1, 4} after replacing each element with its XOR with val(= 2)
The modified array is {0, 1, 4, 5, 4}
2nd Query: Concerned subarray {1, 4, 5} modifies to {5, 0, 1} after replacing each element with its XOR with val(= 4)
Hence, the final array is {0, 5, 0, 1, 4}
Input: arr[] = {1, 3, 5}, Q[][] = {{1, 2, 8}, {2, 3, 3}}
Output: 9 8 6
天真的方法:
解决此问题的最简单方法是遍历每个查询的索引[l – 1,r – 1] ,并将arr [i]替换为arr [i] ^ val 。完成所有查询后,打印修改后的数组。
时间复杂度: O(N * sizeof(Q))
辅助空间: O(1)
方法:通过以固定的时间复杂度处理每个查询来遵循解决问题的步骤:
- 用全零初始化数组temp [] 。
- 对于形式为(l,r,val)的每个查询,请使用val对其各自的XOR更新temp [l – 1]和temp [r] 。
- 完成每个查询的上述步骤后,将temp []转换为前缀XOR数组。
- 最后,通过将每个第i个元素替换为其XOR来执行update arr []。
下面是上述方法的实现:
C++
// C++ Program to implement
// the above approach
#include
using namespace std;
// Function to perform XOR in
// the range [lo, hi]
void findxor(int temp[], int N,
int lo, int hi, int val)
{
temp[lo] ^= val;
if (hi != N - 1)
temp[hi + 1] ^= val;
}
// Function to generate Prefix
// Xor Array
void updateArray(int temp[], int N)
{
for (int i = 1; i < N; i++)
temp[i] ^= temp[i - 1];
}
// Function to perfrom each Query
// and print the final array
void xorQuery(int arr[], int n,
vector > Q)
{
int temp[n];
// initialize temp array to 0
memset(temp, 0, sizeof(temp));
// Perform each Query
for (int i = 0; i < Q.size(); i++) {
findxor(temp, n, Q[i][0] - 1,
Q[i][1] - 1, Q[i][2]);
}
// Modify the array
updateArray(temp, n);
// Print the final array
for (int i = 0; i < n; ++i) {
cout << (arr[i] ^ temp[i]) << " ";
}
}
// Driver Code
int main()
{
int arr[] = { 2, 3, 6, 5, 4 };
int n = sizeof(arr) / sizeof(arr[0]);
vector > Q = { { 1, 3, 2 },
{ 2, 4, 4 } };
xorQuery(arr, n, Q);
return 0;
}
Java
// Java program for the above approach
import java.io.*;
import java.util.*;
class GFG{
// Function to perform XOR in
// the range [lo, hi]
static void findxor(int temp[], int N,
int lo, int hi, int val)
{
temp[lo] ^= val;
if (hi != N - 1)
temp[hi + 1] ^= val;
}
// Function to generate Prefix
// Xor Array
static void updateArray(int temp[], int N)
{
for(int i = 1; i < N; i++)
temp[i] ^= temp[i - 1];
}
// Function to perfrom each Query
// and print the final array
static void xorQuery(int arr[], int n,
int[][] Q)
{
int[] temp = new int[n];
// Perform each Query
for(int i = 0; i < Q.length; i++)
{
findxor(temp, n, Q[i][0] - 1,
Q[i][1] - 1,
Q[i][2]);
}
// Modify the array
updateArray(temp, n);
// Print the final array
for(int i = 0; i < n; ++i)
{
System.out.print((arr[i] ^ temp[i]) + " ");
}
}
// Driver Code
public static void main (String[] args)
{
int arr[] = { 2, 3, 6, 5, 4 };
int n = arr.length;
int[][] Q = { { 1, 3, 2 },
{ 2, 4, 4 } };
xorQuery(arr, n, Q);
}
}
// This code is contributed by offbeat
Python3
# Python3 program to implement
# the above approach
# Function to perform XOR in
# the range [lo, hi]
def findxor(temp, N, lo, hi, val):
temp[lo] ^= val
if (hi != N - 1):
temp[hi + 1] ^= val
# Function to generate Prefix
# Xor Array
def updateArray(temp, N):
for i in range(1, N):
temp[i] ^= temp[i - 1]
# Function to perfrom each Query
# and print the final array
def xorQuery(arr, n, Q):
temp =[0] * n
# Perform each Query
for i in range(len(Q)):
findxor(temp, n, Q[i][0] - 1,
Q[i][1] - 1,
Q[i][2])
# Modify the array
updateArray(temp, n)
# Print the final array
for i in range(n):
print((arr[i] ^ temp[i]), end = " ")
# Driver Code
if __name__ == "__main__":
arr = [ 2, 3, 6, 5, 4 ]
n = len(arr)
Q = [ [ 1, 3, 2 ],
[ 2, 4, 4 ] ]
xorQuery(arr, n, Q)
# This code is contributed by chitranayal
C#
// C# program for the above approach
using System;
class GFG{
// Function to perform XOR in
// the range [lo, hi]
static void findxor(int []temp, int N,
int lo, int hi, int val)
{
temp[lo] ^= val;
if (hi != N - 1)
temp[hi + 1] ^= val;
}
// Function to generate Prefix
// Xor Array
static void updateArray(int []temp, int N)
{
for(int i = 1; i < N; i++)
temp[i] ^= temp[i - 1];
}
// Function to perfrom each Query
// and print the readonly array
static void xorQuery(int []arr, int n,
int[,] Q)
{
int[] temp = new int[n];
// Perform each Query
for(int i = 0; i < Q.GetLength(0); i++)
{
findxor(temp, n, Q[i, 0] - 1,
Q[i, 1] - 1,
Q[i, 2]);
}
// Modify the array
updateArray(temp, n);
// Print the readonly array
for(int i = 0; i < n; ++i)
{
Console.Write((arr[i] ^ temp[i]) + " ");
}
}
// Driver Code
public static void Main(String[] args)
{
int []arr = { 2, 3, 6, 5, 4 };
int n = arr.Length;
int[,] Q = { { 1, 3, 2 },
{ 2, 4, 4 } };
xorQuery(arr, n, Q);
}
}
// This code is contributed by 29AjayKumar
0 5 0 1 4
时间复杂度: O(N)
辅助空间: O(1)