在 C++ 中,求應用給定操作 q 次後陣列中不同數字的個數
在這個問題中,我們給定一個大小為 N 的陣列,陣列元素都為零,以及 Q 個查詢,每個查詢型別如下:
update(s, e, val) -> 此查詢會將從 s 到 e(包含 s 和 e)的所有元素更新為 val。
我們的任務是*找到應用給定操作 q 次後陣列中不同數字的個數*
讓我們來看一個例子來理解這個問題:
Input : N = 6, Q = 2 Q1 = update(1, 4, 3) Q2 = update(0, 2, 4) Output : 2
解釋
初始陣列,arr[] = {0, 0, 0, 0, 0, 0}
查詢 1 - update(1, 4, 3) -> arr[] = {0, 3, 3, 3, 3, 0}
查詢 2 - update(0, 2, 4) -> arr[] = {4, 4, 4, 3, 3, 0}
解決方案
一個簡單的解決方案是對陣列執行每個查詢,然後計算陣列中唯一值的個數,並使用一個額外的陣列。然後返回唯一陣列的個數。
這個解決方案很好,但一個更有效的解決方案是使用*延遲傳播*的概念來最佳化查詢中執行的範圍操作。我們將使用延遲傳播呼叫查詢操作來查詢陣列中唯一數字的個數。為此,我們將使用線段樹,並在執行操作時更新節點,並用 0 初始化樹,操作中更新的值將返回所需的值。以下程式將更好地闡述該解決方案。
示例
程式演示了我們解決方案的工作原理
#include <bits/stdc++.h> using namespace std; #define N 100005 int lazyST[4 * N]; set<int> diffNo; void update(int s, int e, int val, int idx, int l, int r){ if (s >= r or l >= e) return; if (s <= l && r <= e) { lazyST[idx] = val; return; } int mid = (l + r) / 2; if (lazyST[idx]) lazyST[2 * idx] = lazyST[2 * idx + 1] = lazyST[idx]; lazyST[idx] = 0; update(s, e, val, 2 * idx, l, mid); update(s, e, val, 2 * idx + 1, mid, r); } void query(int idx, int l, int r){ if (lazyST[idx]) { diffNo.insert(lazyST[idx]); return; } if (r - l < 2) return; int mid = (l + r) / 2; query(2 * idx, l, mid); query(2 * idx + 1, mid, r); } int main() { int n = 6, q = 3; update(1, 3, 5, 1, 0, n); update(4, 5, 1, 1, 0, n); update(0, 2, 9, 1, 0, n); query(1, 0, n); cout<<"The number of different numbers in the array after operation is "<<diffNo.size(); return 0; }
輸出
The number of different numbers in the array after operation is 3
廣告