C++での部分行列クエリのXOR
この問題では、N x N行列といくつかのクエリが与えられます。各クエリには、この行列から作成された部分行列の左上隅と右下隅が含まれます。私たちのタスクは、クエリによって定義された部分行列のすべての要素のXORを見つけることです。
問題を理解するために例を見てみましょう
入力
arr[][] = {{1, 2, 3} {4, 5, 6} {7, 8, 9}} Querries: {0,0, 1,2} , {1, 2, 2, 2}
出力
1 15
説明
querry 1 : 1^2^3^4^5^6 querry 2 : 6^9
この問題を解決するために、クエリを解決するためのプレフィックスXOR行列を見つけます。位置(R、C)の行列の値は、位置(R、C)の左上隅(0、0)と右下隅からの部分行列のXORです。
最初にプレフィックスを見つけます -マトリックスのすべての行を1つずつXORします。次に、各列のプレフィックスXORを1つずつ計算します。
(r1、c1)から(r2、c2)で与えられるクエリに対する部分行列のXORを見つけるには、prefixXor [r2] [c2] ^ prefixXor [r1-1] [c2] ^ prefixXor[r2][c1を使用して計算されます。 -1] ^ prefixXor[r1-1][c1-1]。
ソリューションの実装を示すプログラム
例
#include <iostream> using namespace std; #define n 3 void preXOR(int arr[][n], int prefix_xor[][n]) { for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) { if (j == 0) prefix_xor[i][j] = arr[i][j]; else prefix_xor[i][j] = (prefix_xor[i][j - 1] ^ arr[i][j]); } for (int i = 0; i < n; i++) for (int j = 1; j < n; j++) prefix_xor[j][i] = (prefix_xor[j - 1][i] ^ prefix_xor[j][i]); } int XORSubMatrix(int prefix_xor[][n], int querry[2]) { int xor_1 = 0, xor_2 = 0, xor_3 = 0; if (querry[0] != 0) xor_1 = prefix_xor[querry[0] - 1][querry[3]]; if (querry[1] != 0) xor_2 = prefix_xor[querry[2]][querry[1] - 1]; if (querry[2] != 0 and querry[1] != 0) xor_3 = prefix_xor[querry[0] - 1][querry[1] - 1]; return ((prefix_xor[querry[2]][querry[3]] ^ xor_1) ^ (xor_2 ^ xor_3)); } int main() { int arr[][n] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; int prefix_xor[n][n]; preXOR(arr, prefix_xor); int querry1[] = {0,0, 2,2} ; int querry2[] = {1,2, 2,2} ; cout<<"The XOR of submatrix created by querries :\n"; cout<<"Querry 1 : "<<XORSubMatrix(prefix_xor, querry1)<<endl; cout<<"Querry 2 : "<<XORSubMatrix(prefix_xor, querry2)<<endl; return 0; }
出力
Querry 1 : 1 Querry 2 : 15
-
範囲の最大の奇数除数のXORに関するC++クエリ
N個の整数の配列と範囲のQ個のクエリが与えられます。クエリごとに、範囲内の各数値の最大の奇数除数のXORを返す必要があります。 最大の奇数除数は、数Nを除算できる最大の奇数です。たとえば、6の最大の奇数除数は3です。 Input: nums[ ] = { 3, 6, 7, 10 }, query[ ] = { { 0, 2 }, { 1, 3 } } Output: query1: 7 query2: 1 Explanation: greatest odd divisors of nums array are { 3, 3, 7, 5 }. For query 1 we need to f
-
ツリー内のサブツリーのDFSに対するC++クエリ
この問題では、バイナリツリーが与えられ、特定のノードからdfsを実行する必要があります。このノードでは、指定されたノードをルートとして想定し、そこからdfsを実行します。 上記のツリーで、ノードFからDFSを実行する必要があると仮定します このチュートリアルでは、いくつかの非正統的な方法を適用して、時間計算量を大幅に削減し、より高い制約に対してもこのコードを実行できるようにします。 アプローチ −このアプローチでは、単純な方法ではありません。つまり、より高い制約では機能しないため、すべてのノードにdfsを適用するだけなので、TLEの取得を回避するためにいくつかの非正統的な方法を使用