ในปัญหานี้ เราได้รับตัวเลข 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