ধরুন আমাদের একটি পূর্ণসংখ্যা অ্যারে সংখ্যা আছে, আমাদেরকে পরিসরের যোগফলের সংখ্যা খুঁজে বের করতে হবে যেটি পরিসীমা [নিম্ন, উপরের] উভয়ই অন্তর্ভুক্ত। ব্যাপ্তির যোগফল S(i, j) সূচক i থেকে সূচক j পর্যন্ত সংখ্যায় উপাদানের যোগফল হিসাবে সংজ্ঞায়িত করা হয় যেখানে i ≤ j।
সুতরাং যদি ইনপুটটি [-3,6,-1], নিম্ন =-2 এবং উপরের =2 এর মত হয়, তাহলে ফলাফল 2 হবে, যেমন রেঞ্জগুলি [0,2], যোগফল হল 2, [2, 2], যোগফল -2।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
- একটি ফাংশন mergeIt() সংজ্ঞায়িত করুন, এটি অ্যারে উপসর্গ, শুরু, মধ্য, শেষ, নিম্ন, উপরের,
- i :=শুরু, j :=মধ্য + 1
- temp :=end - start + 1
- নিম্ন :=মধ্য + 1, উচ্চ :=মধ্য + 1
- k :=0
- আকারের একটি অ্যারে অ্যারের সংজ্ঞা দিন:টেম্প।
- যখন i <=mid, do −
- যখন (নিম্ন <=শেষ এবং উপসর্গ[নিম্ন] - উপসর্গ[i] <নিম্ন), −
- করুন
- 1 দ্বারা কম বাড়ান
- যখন (উচ্চ <=শেষ এবং উপসর্গ [উচ্চ] - উপসর্গ[i] <=উপরের), করুন −
- 1 দ্বারা উচ্চ বৃদ্ধি
- যখন (j <=শেষ এবং উপসর্গ[j] <উপসর্গ[i]), −
- করুন
- arr[k] :=উপসর্গ[j]
- (j 1 দ্বারা বাড়ান)
- (k 1 দ্বারা বাড়ান)
- arr[k] :=উপসর্গ[i]
- (i 1 দ্বারা বাড়ান)
- (k 1 দ্বারা বাড়ান)
- গণনা :=গণনা + উচ্চ - নিম্ন
- যখন (নিম্ন <=শেষ এবং উপসর্গ[নিম্ন] - উপসর্গ[i] <নিম্ন), −
- যখন j <=শেষ, −
- করুন
- arr[k] :=উপসর্গ[j]
- (k 1 দ্বারা বাড়ান)
- (j 1 দ্বারা বাড়ান)
- আরম্ভ করার জন্য i :=0, যখন i
করুন - প্রিফিক্স[start] :=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