MediumRating 1556
3653. XOR After Range Multiplication Queries I
arraydivide-and-conquersimulation
解題說明
XOR After Range Multiplication Queries I
題目描述:給定一個整數陣列 nums 和一系列查詢,每個查詢 [l, r, val] 表示將 nums[l..r] 中的每個元素乘以 val。執行所有查詢後,回傳陣列所有元素的 XOR 值。
解題思路:直接模擬每個查詢是最直觀的方法。對於每個查詢 [l, r, val],遍歷 nums[l] 到 nums[r],將每個元素乘以 val。所有查詢執行完畢後,計算整個陣列的 XOR。
需要注意 XOR 的性質:XOR 不像加法有前綴和的簡單累加方式,因此在乘法操作後很難做懶更新。但若 val = 2 等特殊值,可以利用位運算的特性。在一般情況下,由於資料範圍較小,直接模擬即可。
C++ 解法
複雜度分析
時間複雜度:O(Q * N) — Q 為查詢數,每個查詢最差需遍歷整個陣列。最後計算 XOR 為 O(N)。
空間複雜度:O(1) — 原地修改陣列,只需常數額外空間。
虛擬碼
1. For each query [l, r, val]: a. For i from l to r: nums[i] *= val 2. Compute XOR of all elements in nums 3. Return the XOR result
其他解法
差分陣列 + 乘法拆解:若所有乘法值為 2 的冪,可以用差分陣列記錄每個位置的左移次數,最後一次性計算。但一般乘法值無法用差分陣列優化。
線段樹 + 懶標記:用線段樹維護區間 XOR 並支援區間乘法更新。但由於 XOR 和乘法的結合並不像加法那樣直接,懶標記的設計較為複雜。
延伸思考
- 如果查詢量很大但陣列很小,能否預處理查詢來加速?
- 若操作改為「區間加法」後求 XOR,問題會更簡單還是更難?
- 如果需要在每次查詢後即時回傳當前的 XOR 值,如何高效維護?