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

C++ में दी गई श्रेणी के लिए अधिकतम उपसर्ग-योग

समस्या कथन

n पूर्णांकों और q प्रश्नों की एक सरणी को देखते हुए, प्रत्येक क्वेरी में l से r तक की सीमा होती है। श्रेणी l – r के लिए अधिकतम उपसर्ग-योग ज्ञात कीजिए।

उदाहरण

If input array is arr[] = {-1, 2, 3, -5} and
queries = 2 and ranges are:
l = 0, r = 3
l = 1, r = 3 then output will be 4 and 5.
  • पहली क्वेरी में श्रेणी (0, 3) में [-1, 2, 3, -5] है, क्योंकि यह उपसर्ग है, हमें -1 से शुरू करना होगा। इसलिए, उपसर्ग का अधिकतम योग -1 + 2 + 3 =4 होगा
  • दूसरी क्वेरी में श्रेणी (1, 3) में [2, 3, -5] है, चूंकि यह उपसर्ग है, इसलिए हमें 2 से शुरू करना होगा। इसलिए, अधिकतम उपसर्ग योग 2 + 3 =5<होगा। /ली>

एल्गोरिदम

  • एक सेगमेंट ट्री बनाएं जहां प्रत्येक नोड दो मान s(sum और prefix_sum) संग्रहीत करता है, और अधिकतम उपसर्ग योग खोजने के लिए उस पर एक श्रेणी क्वेरी करें।
  • अधिकतम उपसर्ग योग का पता लगाने के लिए, हमें दो चीजों की आवश्यकता होगी, एक योग और दूसरा उपसर्ग योग
  • विलय दो चीजें लौटाएगा, श्रेणियों का योग और उपसर्ग योग जो सेगमेंट ट्री में अधिकतम (prefix.left, prefix.sum + prefix.right) संग्रहीत करेगा
  • किसी भी दो श्रेणी के संयोजन के लिए अधिकतम उपसर्ग योग या तो बाईं ओर से उपसर्ग योग होगा या बाईं ओर का योग + दाईं ओर का उपसर्ग योग, जो भी अधिकतम हो, को ध्यान में रखा जाएगा।

उदाहरण

#include <bits/stdc++.h>
using namespace std;
typedef struct node {
   int sum;
   int prefix;
} node;
node tree[4 * 10000];
void build(int *arr, int idx, int start, int end) {
   if (start == end) {
      tree[idx].sum = arr[start];
      tree[idx].prefix = arr[start];
   } else {
      int mid = (start + end) / 2;
      build(arr, 2 * idx + 1, start, mid);
      build(arr, 2 * idx + 2, mid + 1, end);
      tree[idx].sum = tree[2 * idx + 1].sum + tree[2 *
      idx + 2].sum;
      tree[idx].prefix = max(tree[2 * idx + 1].prefix,
      tree[2 * idx + 1].sum + tree[2 * idx + 2].prefix);
   }
}
node query(int idx, int start, int end, int l, int r) {
   node result;
   result.sum = result.prefix = -1;
   if (start > r || end < l) {
      return result;
   }
   if (start >= l && end <= r) {
      return tree[idx];
   }
   int mid = (start + end) / 2;
   if (l > mid) {
      return query(2 * idx + 2, mid + 1, end, l, r);
   }
   if (r <= mid) {
      return query(2 * idx + 1, start, mid, l, r);
   }
   node left = query(2 * idx + 1, start, mid, l, r);
   node right = query(2 * idx + 2, mid + 1, end, l, r);
   result.sum = left.sum + right.sum;
   result.prefix = max(left.prefix, left.sum + right.prefix);
   return result;
}
int main() {
   int arr[] = { -2, -3, 4, -1, -2, 1, 5, -3 };
   int n = sizeof(arr) / sizeof(arr[0]);
   build(arr, 0, 0, n - 1);
   cout << "Result = " << query(0, 0, n - 1, 3, 5).prefix
   << endl;
   return 0;
}

आउटपुट

जब आप उपरोक्त प्रोग्राम को संकलित और निष्पादित करते हैं। यह निम्नलिखित आउटपुट उत्पन्न करता है -

Result = -1

  1. सी++ में त्रिभुज में अधिकतम पथ योग

    इस समस्या में, हमें ऐसी संख्याएँ दी जाती हैं जो एक त्रिभुज के रूप में होती हैं। हमारा काम एक ऐसा प्रोग्राम बनाना है जो एक त्रिभुज में अधिकतम पथ योग प्राप्त करे। तत्वों को पहली पंक्ति से 1 एक तत्व के साथ व्यवस्थित किया जाता है और फिर अगली पंक्तियों में तत्वों की बढ़ती संख्या के साथ nth पंक्ति में तत

  1. C++ में दी गई सीमा से अधिकतम बिटवाइज़ और जोड़ी

    समस्या कथन एक श्रेणी [एल, आर] को देखते हुए, कार्य एक जोड़ी (एक्स, वाई) को ढूंढना है जैसे कि एल ≤ एक्स <वाई ≤ आर और एक्स और वाई सभी संभावित जोड़े में से अधिकतम है, फिर बिटवाइज और मिली जोड़ी को प्रिंट करें । उदाहरण यदि L =1 और R =10 है तो बिटवाइज अधिकतम और मान 8 है जिसे निम्न प्रकार से बनाया जा सकता

  1. सी++ प्रोग्राम बिना अपडेट के रेंज सम क्वेश्चन के लिए?

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