Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

सी++ में रेंज योग की गणना

मान लीजिए कि हमारे पास एक पूर्णांक सरणी संख्याएँ हैं, हमें श्रेणी योगों की संख्या ज्ञात करनी है जो सीमा [निचले, ऊपरी] दोनों में शामिल हैं। रेंज योग 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 से बढ़ाएं)
    • गिनती :=गिनती + उच्च-निम्न
  • जबकि j <=समाप्त होता है, −
      . करें
    • arr[k] :=उपसर्ग[j]
    • (k 1 से बढ़ाएं)
    • (j को 1 से बढ़ाएं)
  • इनिशियलाइज़ i :=0 के लिए, जब i करें
  • उपसर्ग[शुरू] :=arr[i]
  • (शुरुआत को 1 से बढ़ाएं)
  • एक फ़ंक्शन मर्ज () को परिभाषित करें, यह उपसर्ग लेगा [], प्रारंभ, अंत, निचला, ऊपरी,
    • यदि प्रारंभ>=समाप्त हो, तो वापस लौटें
  • मध्य :=प्रारंभ + (अंत - प्रारंभ)
  • फ़ंक्शन मर्ज को कॉल करें (उपसर्ग, प्रारंभ, मध्य, निचला, ऊपरी)
  • फ़ंक्शन मर्ज को कॉल करें (उपसर्ग, मध्य + 1, अंत, निचला, ऊपरी)
  • फ़ंक्शन को कॉल करें मर्ज इट (उपसर्ग, प्रारंभ, मध्य, अंत, निचला, ऊपरी)
  • मुख्य विधि से, निम्न कार्य करें -
  • n :=अंकों का आकार
  • गिनती :=0
  • आकार के सरणी उपसर्ग को परिभाषित करें:n+1.
  • उपसर्ग[0] :=0
  • इनिशियलाइज़ i :=1 के लिए, जब i <=n, अपडेट करें (i को 1 से बढ़ाएँ), −
      करें
    • उपसर्ग[i] :=उपसर्ग[i - 1] + अंक[i - 1]
  • फ़ंक्शन मर्ज को कॉल करें (उपसर्ग, 0, n, निचला, ऊपरी)
  • वापसी की संख्या
  • आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

    उदाहरण

    #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

    1. C++ में दी गई श्रेणी में भाज्य संख्याओं की गणना करें

      हमें एक चर द्वारा धारित पूर्णांक मान से शुरू होने वाली श्रेणी दी गई है, मान लीजिए कि चर अंत तक शुरू होता है और कार्य दी गई सीमा में उपलब्ध भाज्य संख्याओं की कुल संख्या की गणना करना है। फैक्टोरियल नंबर क्या है किसी संख्या के भाज्य की गणना अंकों के अंकों को 1 से घटाते हुए अंकों को गुणा करके की जाती ह

    1. रेंज सम क्वेरी 2D - C++ में अपरिवर्तनीय

      मान लीजिए कि हमारे पास एक 2D मैट्रिक्स है जिसे मैट्रिक्स कहा जाता है, हमें (row1, col1) का उपयोग करके (row1, col1) और निचले दाएं कोने द्वारा परिभाषित आयत के अंदर तत्वों का योग ज्ञात करना होगा ( row2, col2)। तो अगर मैट्रिक्स की तरह है - 3 0 1 4 2 5 6 3 2 1 1 2 0 1 5 4 1 0 1 7 1 0 3 0 5 उपरोक्

    1. रेंज सम क्वेरी - C++ में अपरिवर्तनीय

      मान लीजिए कि हमारे पास पूर्णांकों की एक सरणी है। हमें अनुक्रमणिका i से j तक उपस्थित तत्वों का योग ज्ञात करना है। हमें दो बातों का ध्यान रखना होगा कि सरणी अपरिवर्तनीय होगी, इसलिए तत्वों को नहीं बदला जाएगा, और ऐसे कई प्रश्न होंगे। इसलिए हमें बड़ी संख्या में प्रश्नों के निष्पादन समय की परवाह करनी होगी।