From 812b20f41817e02b854367cad6547e2827311511 Mon Sep 17 00:00:00 2001 From: Phluenam Date: Mon, 30 Oct 2023 22:04:39 +0800 Subject: [PATCH] Add 2030 (#148) * Add 2030 * edit * Update 2030.md --------- Co-authored-by: Blackslex <58735442+Thunyatorn@users.noreply.github.com> --- md/2030.md | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 md/2030.md diff --git a/md/2030.md b/md/2030.md new file mode 100644 index 0000000..39627f9 --- /dev/null +++ b/md/2030.md @@ -0,0 +1,60 @@ +ข้อนี้ให้ Array $a_1, a_2, \dots, a_N$ $(N \leq 1000000)$ และให้หาจำนวน Subarray ที่มีพิสัย (ค่ามากสุด - ค่าต่ำสุด) อยู่ในช่วง $[p,q]$ + +### แนวคิด + +ข้อนี้เป็นโจทย์ Sliding Window + +อย่างแรกสังเกตว่าเราสามารถคำนวณจำนวนลำดับย่อยที่มีพิสัยในช่วง $[p,q]$ เป็น (จำนวนลำดับย่อยที่มีพิสัยไม่เกิน $q$) - (จำนวนลำดับย่อยที่มีพิสัยไม่เกิน $p-1$) ดังนั้นสำหรับข้อนี้เราจะพิจารณาการหาจำนวนลำดับย่อยที่มีพิสัยไม่เกิน $q$ + +ในจำนวนลำดับย่อยที่มีพิสัยไม่เกิน $q$ เราสามารถพิจารณาจำนวนลำดับย่อยที่เข้าข่ายที่จบที่แต่ละ $a_i$ หากนำจำนวนนี้มาบวกกันสำหรับทุก $a_i$ จะได้คำตอบที่ต้องการ + +สังเกตว่าสำหรับ $m &a) { + deque d_max; + deque d_min; + + long long res = 0; + long long l = 0; + for (int i = 0; i < a.size(); i++) { + while (d_max.size() > 0 && a[d_max.back()] <= a[i]) + d_max.pop_back(); + d_max.push_back(i); + + while (d_min.size() > 0 && a[d_min.back()] >= a[i]) + d_min.pop_back(); + d_min.push_back(i); + + while (l <= i && a[d_max[0]] - a[d_min[0]] > q) { + l++; + + while (d_max.size() > 0 && d_max[0] < l) + d_max.pop_front(); + + while (d_min.size() > 0 && d_min[0] < l) + d_min.pop_front(); + } + res += (i - l + 1); + } + return res; +} +``` + +นี่คือโค้ดตัวอย่างสำหรับการหาจำนวน Subarray ที่มีพิสัยไม่เกิน $q$ + +เราจะเก็บ Sliding Window สองอันคือ `d_min` กับ `d_max` และเก็บค่า $l$ ที่อธิบายไดว้ + +ในแต่ละขั้นจะ push $i$ เข้า Sliding Window ทั้งสองโดยเอาข้อมูลที่สำคัญแล้วออก (ต่ำกว่าค่าปัจจุบันสำหรับ `d_max` หรือ สูงกว่าค่าปัจจุบันสำหรับ `d_min`) + +จากนั้นจะเพิ่มค่า $l$ และ pop ค่าที่อยู่ก่อน $l$ ในแต่ละ Window จนพิสัยไม่เกิน $q$