ในปัญหานี้ เราได้รับคำสั่ง bitonic Sequence และ Q แต่ละแบบสอบถามมีจำนวนเต็ม x งานของเราคือการพิมพ์ความยาวของลำดับบิตโทนิกหลังจากใส่จำนวนเต็มหลังการสืบค้นแต่ละครั้ง และในตอนท้ายให้พิมพ์ลำดับบิตโทนิก
คำอธิบายปัญหา − ในที่นี้ เราได้รับลำดับบิตโทนิก และมีคิวรี Q ซึ่งแต่ละอันมีหนึ่งจำนวนเต็มที่จะเพิ่มลงในลำดับ เราจะเพิ่มองค์ประกอบจากการสืบค้นแต่ละครั้งไปยังลำดับ จากนั้นจึงคืนค่าความยาวของลำดับ bitonic หลังจากที่แบบสอบถามทั้งหมดเสร็จสิ้น เราจะพิมพ์ลำดับบิตโทนิก
ซีเควนซ์ไบโทนิค เป็นลำดับชนิดพิเศษซึ่งเพิ่มขึ้นจนถึงจุดหนึ่ง (เรียกว่าจุดบิโตนิก) แล้วลดลง
ตัวอย่าง − 1, 5, 6, 8, 9, 7, 5, 2
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากันดีกว่า
อินพุต
bseq = {1, 4, 6, 5, 2, 1}
Q = 2
Query = {5, 6 } ผลลัพธ์
7 7
{1, 4, 5, 6, 5, 2, 1 } คำอธิบาย
สำหรับข้อความค้นหาแรก ค่าที่จะแทรกคือ 5 ซึ่งสามารถแทรกในส่วนที่เพิ่มขึ้นของลำดับที่สร้างลำดับได้ {1, 4, 5, 6, 5, 2, 1 }, ความยาว 7
สำหรับข้อความค้นหาแรก ค่าที่จะแทรกคือ 6 ซึ่งไม่สามารถแทรกได้ เนื่องจาก 6 คือค่าสูงสุด ดังนั้น 6 จะไม่ถูกแทรก
ลำดับสุดท้าย {1, 4, 5, 6, 5, 2, 1 } ความยาว 7.
เพื่อแก้ปัญหานี้ เราจะต้องแยกลำดับบิตโทนิกออกเป็นสองชุด ชุดหนึ่งเพื่อเพิ่มส่วนของลำดับให้มีค่าสูงสุด อีกอันหนึ่งสำหรับส่วนที่ลดลงของลำดับ
ตอนนี้ สำหรับทุกองค์ประกอบที่จะแทรก สามารถเป็นกรณีต่อไปนี้ -
กรณีที่ 1(หากองค์ประกอบมากกว่าค่าสูงสุด) − เพิ่มองค์ประกอบที่ส่วนท้ายของซีรีย์ที่เพิ่มขึ้น และอัปเดตสูงสุด
กรณีที่ 2 − หากองค์ประกอบน้อยกว่าค่าสูงสุด ให้เช็คอินชุดที่เพิ่มขึ้นก่อนสำหรับความพร้อมใช้งานขององค์ประกอบ แทรกหากไม่มีองค์ประกอบที่เท่ากับองค์ประกอบนั้น มิฉะนั้น ให้ค้นหาในชุดที่ลดลงและเพิ่มหากเป็นไปได้
กรณีที่ 3 (หากองค์ประกอบเท่ากับค่าสูงสุดหรือค่าที่มีอยู่ในชุดที่เพิ่มขึ้นและลดลง) − ปล่อยให้องค์ประกอบไม่สามารถเพิ่มได้
หลังจากการสืบค้นแต่ละครั้ง เราจะหาชุดของลำดับบิตโทนิกโดยการเพิ่มความยาวของทั้งสองชุด
length(bseq) = length(incSet) + length(decSet)
หลังจากเสร็จสิ้นการสืบค้นข้อมูลทั้งหมดแล้ว ให้พิมพ์ลำดับ bitonic โดยพิมพ์ theincSet แล้วพิมพ์ decSet
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา -
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
void calcBitonicSeqLenth(int bSeq[], int n, int query[], int Q){
int maxVal = INT_MIN;
for (int i = 0; i < n; i++)
maxVal = max(maxVal, bSeq[i]);
set <int> incSet, decSet;
incSet.insert(bSeq[0]);
decSet.insert(bSeq[n - 1]);
for (int i = 1; i < n; i++)
if (bSeq[i] > bSeq[i - 1])
incSet.insert(bSeq[i]);
for (int i = n - 2; i >= 0; i--)
if (bSeq[i] > bSeq[i + 1])
decSet.insert(bSeq[i]);
decSet.erase(decSet.find(maxVal));
for (int i = 0; i < Q; i++) {
if (maxVal <= query[i]) {
maxVal = query[i];
incSet.insert(query[i]);
}
else {
if (incSet.find(query[i]) == incSet.end())
incSet.insert(query[i]);
else
decSet.insert(query[i]);
}
int length = incSet.size() + decSet.size();
cout<<"For query "<<(i+1)<<": The length of Bitonic Sequence is "<<length<<endl;
}
cout<<"The Bitonic Sequence at the end of all queries is : ";
set<int>::iterator it;
for (it = incSet.begin(); it != incSet.end(); it++)
cout<<(*it)<<" ";
set<int>::reverse_iterator revIt;
for (revIt = decSet.rbegin(); revIt != decSet.rend(); revIt++)
cout<<(*revIt)<<" ";
}
int main(){
int bSeq[] = { 1, 4, 6, 5, 2, 1 };
int n = sizeof(bSeq) / sizeof(bSeq[0]);
int Q = 2;
int query[] = { 6, 5 };
calcBitonicSeqLenth(bSeq, n, query, Q);
return 0;
} ผลลัพธ์
For query 1: The length of Bitonic Sequence is 6 For query 2: The length of Bitonic Sequence is 7 The Bitonic Sequence at the end of all queries is : 1 4 5 6 5 2 1