Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ค้นหาจำนวนตัวเลขที่แตกต่างกันในอาร์เรย์หลังจากใช้การดำเนินการที่กำหนด q ครั้งใน C++


ในปัญหานี้ เราได้รับตัวเลข N ซึ่งเป็นขนาดของอาร์เรย์ที่ประกอบด้วยศูนย์ทั้งหมดและแบบสอบถาม Q แต่ละประเภทต่อไปนี้ -

อัปเดต (s, e, val ) -> แบบสอบถามนี้จะอัปเดตองค์ประกอบทั้งหมดจาก s เป็น e (รวมทั้งสอง) เป็น val

งานของเราคือ ค้นหาจำนวนตัวเลขที่แตกต่างกันในอาร์เรย์หลังจากใช้การดำเนินการที่กำหนด q ครั้ง

มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน

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

Output : 2

คำอธิบาย

อาร์เรย์เริ่มต้น arr[] ={0, 0, 0, 0, 0, 0}

แบบสอบถาม 1 - อัปเดต (1, 4, 3) -> arr[] ={0, 3, 3, 3, 3, 0}

แบบสอบถาม 2 - อัปเดต (0, 2, 4) -> arr[] ={4, 4, 4, 3, 3, 0}

แนวทางการแก้ปัญหา

วิธีแก้ปัญหาอย่างง่ายคือดำเนินการค้นหาแต่ละรายการในอาร์เรย์ แล้วนับจำนวนค่าที่ไม่ซ้ำในอาร์เรย์และใช้อาร์เรย์พิเศษ แล้วคืนค่าจำนวนอาร์เรย์ที่ไม่ซ้ำ

วิธีแก้ปัญหานี้ดีแต่วิธีแก้ปัญหาที่มีประสิทธิภาพมากกว่าคือการใช้แนวคิดของ การแพร่กระจายแบบขี้เกียจ เพื่อเพิ่มประสิทธิภาพการทำงานของช่วงที่ดำเนินการในแบบสอบถาม เราจะใช้การเรียกแบบ lazy propagation เพื่อดำเนินการค้นหาเพื่อค้นหาจำนวนตัวเลขที่ไม่ซ้ำในอาร์เรย์ สำหรับสิ่งนี้ เราจะใช้แผนผังเซ็กเมนต์และอัปเดตโหนดเมื่อดำเนินการและเริ่มต้นทรีด้วยค่า 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