मान लीजिए कि हमारे पास एक पूर्णांक सरणी संख्याएँ हैं, हमें श्रेणी योगों की संख्या ज्ञात करनी है जो सीमा [निचले, ऊपरी] दोनों में शामिल हैं। रेंज योग S(i, j) को इंडेक्स i से इंडेक्स j तक के अंकों में तत्वों के योग के रूप में परिभाषित किया गया है, जहां i j.
तो अगर इनपुट [-3,6,-1], निचला =-2 और ऊपरी =2 जैसा है, तो परिणाम 2 होगा, क्योंकि श्रेणियां [0,2] हैं, योग 2 है, [2, 2], योग -2 है।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- एक फ़ंक्शन मर्ज इट () को परिभाषित करें, यह सरणी उपसर्ग, प्रारंभ, मध्य, अंत, निचला, ऊपरी, लेगा
- i :=start, j :=mid + 1
- अस्थायी:=अंत - प्रारंभ + 1
- निम्न:=मध्य + 1, उच्च:=मध्य + 1
- k :=0
- आकार की एक सरणी एरर परिभाषित करें:अस्थायी।
- जबकि मैं <=बीच में, −
- . करें
- जबकि (निम्न <=अंत और उपसर्ग [निम्न] - उपसर्ग [i] <निचला), करते हैं -
- 1 से कम बढ़ाएं
- जबकि (उच्च <=अंत और उपसर्ग [उच्च] - उपसर्ग [i] <=ऊपरी), करते हैं −
- ऊंचाई 1 से बढ़ाएं
- जबकि (j <=अंत और उपसर्ग[j] <उपसर्ग[i]), करते हैं −
- arr[k] :=उपसर्ग[j]
- (j को 1 से बढ़ाएं)
- (k 1 से बढ़ाएं)
- arr[k] :=उपसर्ग[i]
- (मैं 1 से बढ़ाएँ)
- (k 1 से बढ़ाएं)
- गिनती :=गिनती + उच्च-निम्न
- जबकि (निम्न <=अंत और उपसर्ग [निम्न] - उपसर्ग [i] <निचला), करते हैं -
- जबकि j <=समाप्त होता है, −
- . करें
- arr[k] :=उपसर्ग[j]
- (k 1 से बढ़ाएं)
- (j को 1 से बढ़ाएं)
- इनिशियलाइज़ i :=0 के लिए, जब i
करें - उपसर्ग[शुरू] :=arr[i]
- (शुरुआत को 1 से बढ़ाएं)
- यदि प्रारंभ>=समाप्त हो, तो वापस लौटें
- करें
- उपसर्ग[i] :=उपसर्ग[i - 1] + अंक[i - 1]
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
public:
int count = 0;
void mergeIt(lli prefix[], lli start ,lli mid, lli end, lli lower, lli upper){
lli i = start, j = mid + 1;
lli temp = end - start + 1;
lli low = mid + 1, high = mid + 1;
lli k = 0;
lli arr[temp];
while(i <= mid){
while(low <= end && prefix[low] - prefix[i] < lower) low++;
while(high <= end && prefix[high] - prefix[i] <= upper) high++;
while(j<= end && prefix[j] < prefix[i]){
arr[k] = prefix[j];
j++;
k++;
}
arr[k] = prefix[i];
i++;
k++;
count += high - low;
}
while(j <= end){
arr[k] = prefix[j];
k++;
j++;
}
for(i = 0; i < temp; i++){
prefix[start] = arr[i];
start++;
}
}
void merge(lli prefix[], lli start, lli end, lli lower, lli upper){
if(start >= end)return;
lli mid = start + (end - start) / 2;
merge(prefix, start, mid, lower, upper);
merge(prefix, mid + 1, end, lower, upper);
mergeIt(prefix, start, mid, end, lower, upper);
}
int countRangeSum(vector<int>& nums, int lower, int upper) {
lli n = nums.size();
count = 0;
lli prefix[n + 1];
prefix[0] = 0;
for(lli i = 1; i <= n; i++){
prefix[i] = prefix[i - 1] + nums[i - 1];
}
merge(prefix, 0, n, lower, upper);
return count;
}
};
main(){
Solution ob;
vector<int> v = {-3,6,-1};
cout << (ob.countRangeSum(v, -2, 2));
} इनपुट
{-3,6,-1}
-2
2 आउटपुट
2