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

C++ में दिए गए ऑपरेशन को q बार लागू करने के बाद सरणी में विभिन्न संख्याओं की संख्या ज्ञात कीजिए

इस समस्या में, हमें एक संख्या N दी जाती है जो एक सरणी के आकार की होती है जिसमें सभी शून्य और Q निम्न प्रकार के प्रत्येक प्रश्न होते हैं -

अपडेट (एस, ई, वैल) -> यह क्वेरी एस से ई (दोनों समावेशी) से वैल तक सभी तत्वों को अपडेट कर देगी।

हमारा कार्य दिए गए ऑपरेशन q बार लागू करने के बाद सरणी में विभिन्न संख्याओं की संख्या ज्ञात करना है

समस्या को समझने के लिए एक उदाहरण लेते हैं,

Input : N = 6, Q = 2
Q1 = update(1, 4, 3)
Q2 = update(0, 2, 4)

Output : 2

स्पष्टीकरण

प्रारंभिक सरणी, एआर [] ={0, 0, 0, 0, 0, 0}

क्वेरी 1 - अपडेट(1, 4, 3) -> arr[] ={0, 3, 3, 3, 3, 0}

प्रश्न 2 - अद्यतन(0, 2, 4) -> गिरफ्तार [] ={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

  1. C++ प्रोग्राम दिए गए ग्राफ़ में ब्रिज किनारों की संख्या का पता लगाने के लिए

    मान लीजिए, हमें एक अभारित, अप्रत्यक्ष ग्राफ दिया गया है जिसमें n कोने और m किनारे हैं। ग्राफ़ में ब्रिज का किनारा वह किनारा होता है जिसके हटाने से ग्राफ़ डिस्कनेक्ट हो जाता है। हमें दिए गए आलेख में ऐसे आलेखों की संख्या ज्ञात करनी है। ग्राफ़ में समानांतर किनारे या सेल्फ़-लूप नहीं होते हैं। इसलिए, यद

  1. C++ में दिए गए सूचकांकों के साथ N फाइबोनैचि संख्याओं की GCD ज्ञात कीजिए

    यहाँ हमें दिए गए सूचकांकों के साथ n फाइबोनैचि पदों की GCD ज्ञात करनी है। तो सबसे पहले हमें अधिकतम सूचकांक प्राप्त करना होगा, और फाइबोनैचि शब्द उत्पन्न करना होगा, कुछ फाइबोनैचि शब्द इस प्रकार हैं:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ….. सूचकांक शुरू होता है 0 से। तो तत्व 0th . पर सूचकांक 0 है। यदि हमें स

  1. सी ++ प्रोग्राम संख्याओं की एक सरणी के उत्पाद में पहला अंक खोजने के लिए

    इस लेख में, हम दिए गए सरणी के तत्वों के उत्पाद में पहला अंक खोजने के लिए एक कार्यक्रम पर चर्चा करेंगे। उदाहरण के लिए, मान लें कि हमें एक सरणी दी गई है। arr = {12, 5, 16} तब इन तत्वों का गुणनफल 12*5*16 =960 होगा। इसलिए, परिणाम यानी इस मामले में उत्पाद का पहला अंक 9 होगा। उदाहरण #include <bits/st