programming.in.th · ข้อ 2025
ปิดอุโมงค์หนึ่งเส้น เปิดใหม่หนึ่งเส้น ให้คู่ห้องที่ไกลกันที่สุดใกล้กันที่สุด บทนี้ไล่จากลองทุกแบบ ไปสูตรที่บอกว่าต้องต่อที่จุดกึ่งกลาง แล้วหาความยาวของสองก้อนของทุกเส้นด้วยการไล่ค่าขาลงกับขาขึ้น
ตัวตุ่นขุดห้องไว้ N ห้อง แล้วเชื่อมด้วยอุโมงค์จนเดินจากห้องไหนไปห้องไหนก็ได้ และมีทางเดียวเสมอ
รูปแบบนี้เรียกว่าต้นไม้ (tree) ซึ่งมีอุโมงค์ N ลบหนึ่งเส้นพอดี
ระยะระหว่างสองห้องคือจำนวนอุโมงค์ที่ต้องผ่าน
แขกบางคนบ่นว่าบางคู่ห้องเดินไกลเกินไป ตัวตุ่นเลยจะปิดอุโมงค์หนึ่งเส้นแล้วเปิดเส้นใหม่หนึ่งเส้น โดยทุกห้องยังต้องเดินถึงกันได้ เป้าหมายคือทำให้ระยะของคู่ห้องที่ไกลกันที่สุดน้อยที่สุด
อินพุต / ขอบเขต / เอาต์พุต
N จากนั้นอีก N ลบหนึ่งบรรทัด บรรทัดละสองเลข คือห้องสองห้องที่อุโมงค์เส้นนั้นเชื่อม1 ≤ N ≤ 300,000 ห้องมีหมายเลข 1 ถึง N เวลา 3 วินาที หน่วยความจำ 128 เมกะไบต์| Input | Output |
|---|---|
| 4 1 2 2 3 3 4 | 2 3 4 4 2 |
| 7 1 3 2 3 2 7 4 3 7 5 3 6 | 3 2 3 7 3 |
อ่านตัวอย่างนี้ยังไง
ใบ้
พอปิดอุโมงค์ไปหนึ่งเส้น ต้นไม้จะแตกเป็นสองก้อนเสมอ (กลุ่มห้องที่ยังเดินถึงกันเองได้) อุโมงค์ใหม่ต้องเชื่อมสองก้อนนั้น ไม่งั้นจะมีห้องที่เดินไปไม่ถึง
ถ้ารู้แล้วว่าปิดเส้นไหน คำถามที่เหลือคือควรต่อที่ห้องไหนของแต่ละก้อน ลองดูว่าห้องไหนของก้อนอยู่ใกล้ทุกห้องในก้อนมากที่สุด
ทางเดินเส้นเดียวคือกรณีที่มองออกง่ายที่สุด ตัดตรงไหนแล้วได้อะไร ลองให้ครบทุกเส้น
กดที่เส้นเพื่อเลือกอุโมงค์ที่จะปิดก่อน
ยังไม่ได้เลือกอะไร
ปิดหนึ่งเส้นแล้วผังจะแตกเป็นสองก้อน จากนั้นกดหนึ่งห้องในแต่ละก้อนเพื่อเปิดอุโมงค์ใหม่
เล่นให้ครบสามผังก่อนนะครับ ระหว่างเล่นลองสังเกตว่าห้องที่ต่อแล้วได้ผลดี อยู่ตรงไหนของก้อนของมัน
โจทย์แบ่งคะแนนตามขนาดของ N ไว้แบบนี้ ซึ่งบอกว่าวิธีช้า ๆ ก็เก็บคะแนนได้ก่อน
| ส่วนของคะแนน | ขอบเขต |
|---|---|
| 40% | N น้อยกว่า 30 |
| 70% | N น้อยกว่า 3,000 |
| 100% | N ถึง 300,000 |
เริ่มจากวิธีที่ช้าแต่ถูกแน่นอนก่อน คือทำตามโจทย์ทุกตัวอักษร
ข้อ 3 วัดด้วยการเดินกว้าง (BFS ย่อมาจาก breadth-first search) คือเริ่มจากห้องหนึ่ง เยี่ยมทุกห้องที่ห่างหนึ่งอุโมงค์ แล้วทุกห้องที่ห่างสอง ไล่ไปเรื่อย ๆ จนครบ เดินกว้างจากทุกห้องก็ได้ระยะของทุกคู่
ระยะของคู่ห้องที่ไกลที่สุดในต้นไม้เรียกว่าเส้นผ่านศูนย์กลาง (diameter อ่านว่า ได-แอ-มิ-เตอร์) ยืมคำมาจากวงกลม บทนี้ใช้คำนี้บ่อย จะขอเรียกสั้น ๆ ว่าความยาวของต้นไม้หรือของก้อน
นับงานของวิธีนี้
N รวม 3NN รอบ รวม 3N²N ห้องเป็นกรณีที่มีคู่มากที่สุด ปิดเส้นที่ k ได้ก้อน k กับ N − k ห้อง มีคู่ k(N − k) รวมทุก k ได้ (N³ − N) / 6 คู่N = 29: 4,060 คู่ × 3 × 841 = 10,243,380 ครั้ง ทันสบาย (ทางเดิน 29 ห้อง วัดจริง 0.04 วินาที)N = 2,999: ราว 1.2×1017 ครั้ง ไม่มีทางทันวิธีนี้เก็บได้แค่ชุด 40% แต่มันมีค่ามากในฐานะตัวตรวจ เพราะมันไม่เชื่ออะไรเลยนอกจากการวัดจริง ทุกวิธีที่เร็วกว่าจะถูกเทียบกับมัน
ที่มาของแนวคิดนี้
ในวิธีลองทุกแบบ งานเกือบทั้งหมดหมดไปกับการลองคู่ห้อง ต่อเส้นมีคู่ได้ถึงราว N²/4 คู่
ถ้าจะเร็วขึ้น ต้องมีเหตุผลที่ทำให้ไม่ต้องลองคู่ เครื่องมือที่ตรงที่สุดคือเขียนระยะไกลสุดหลังต่อออกมาเป็นสูตร
แล้วดูว่าห้องที่ต่อไปอยู่ในส่วนไหนของสูตรบ้าง
บทเรียนที่ยกไปข้ออื่นได้คือ เวลามีตัวแปรหลายตัว ให้เขียนสูตรของคำตอบก่อน แล้วดูว่าตัวแปรไหนมีค่าที่ดีที่สุดตายตัว
สมมติปิดเส้นหนึ่งไปแล้ว ได้ก้อนซ้ายยาว d1 กับก้อนขวายาว d2 แล้วต่อห้อง x ของก้อนซ้ายกับห้อง y ของก้อนขวา ทางระหว่างสองห้องใด ๆ ในผังใหม่มีแค่สามแบบ
| ทาง | ยาวสุดเท่าไร | ขึ้นกับ x, y ไหม |
|---|---|---|
| อยู่ในก้อนซ้ายทั้งหมด | d1 | ไม่ขึ้น อุโมงค์ใหม่ไม่ได้ทำให้ทางในก้อนเดียวกันสั้นลง เพราะเดินออกไปอีกก้อนแล้วต้องกลับทางเดิม |
| อยู่ในก้อนขวาทั้งหมด | d2 | ไม่ขึ้น ด้วยเหตุผลเดียวกัน |
| ข้ามอุโมงค์ใหม่ (ทางข้าม) | ระยะไกลสุดจาก x ในก้อนซ้าย + 1 + ระยะไกลสุดจาก y ในก้อนขวา | ขึ้น และเป็นตัวเดียวที่เราคุมได้ |
สองแถวแรกตายตัว เหลือแถวที่สามที่ห้องที่ต่อมีผล และสองฝั่งของมันแยกกันคิดได้
x กับ y เป็นจุดกึ่งกลางของก้อนของตัวเอง ได้ รัศมี + 1 + รัศมีก้อนที่ยาวเป็นเลขคี่มีจุดกึ่งกลางสองห้อง ใช้ห้องไหนก็ได้ และบางทีห้องอื่นก็ได้ค่าเท่ากัน จุดกึ่งกลางเป็นทางเลือกหนึ่งที่ดีที่สุดเสมอ ไม่ได้เป็นทางเดียว
ต่อไปจะใช้เครื่องหมาย ⌈ ⌉ แปลว่าปัดขึ้น เช่น ⌈5/2⌉ = 3 และ ⌊ ⌋ แปลว่าปัดลง เช่น ⌊5/2⌋ = 2
รัศมีของต้นไม้ที่ยาว d เท่ากับ ⌈d/2⌉ เสมอ เหตุผลมีสองครึ่ง ให้ a กับ b เป็นคู่ห้องที่ไกลกัน d
a บวกระยะไป b อย่างน้อย d ปลายข้างที่ไกลกว่าเลยห่างอย่างน้อย ⌈d/2⌉m เป็นห้องบนทาง a ถึง b ที่ห่าง a เท่ากับ ⌈d/2⌉ และห่าง b เท่ากับ ⌊d/2⌋z ที่ห่าง m อย่างน้อย ⌈d/2⌉ + 1 ทางจาก z มาชนทาง a ถึง b ที่ฝั่งใดฝั่งหนึ่งของ m ให้เดินต่อผ่าน m ไปยังปลายอีกฟาก ได้ยาวอย่างน้อย ⌈d/2⌉ + 1 + ⌊d/2⌋ = d + 1 ซึ่งยาวกว่าคู่ที่ไกลที่สุด เป็นไปไม่ได้ ห้อง m จึงไกลสุดไม่เกิน ⌈d/2⌉สูตรของหนึ่งเส้น
ปิดเส้นที่แบ่งได้ก้อนยาว d1 กับ d2 แล้วต่อจุดกึ่งกลางกับจุดกึ่งกลาง ค่าที่ได้คือ
มากสุดของ ( d1 , d2 , ⌈d1/2⌉ + 1 + ⌈d2/2⌉ )
ไม่มีแผนไหนที่ปิดเส้นนี้แล้วได้น้อยกว่านี้ เพราะสองตัวแรกต้องอยู่แล้ว และตัวที่สามคือทางข้ามที่สั้นที่สุดที่เป็นไปได้
// ปิดเส้นหนึ่งแล้วได้สองก้อน ยาว d1 กับ d2
// ต่อที่จุดกึ่งกลางของทั้งสองก้อน ทางข้ามอุโมงค์ใหม่ยาว รัศมี + 1 + รัศมี
// ค่าของเส้นนี้คือตัวที่มากที่สุดในสามตัว
int s = max(max(d1, d2), (d1 + 1) / 2 + (d2 + 1) / 2 + 1); ลองกับต้น 9 ห้องในเกม
ลองต่อทุกคู่ห้องของเส้นนี้ (18 คู่) แบบลองทุกแบบ ได้ค่าดีที่สุด 4 ตรงกับสูตร
สูตรของหนึ่งเส้นต้องการแค่ความยาวของสองก้อน งานต่อเส้นเหลือแค่วัดสองก้อนนั้น วิธีมาตรฐานคือเดินกว้างสองรอบ
ทบทวนพื้นฐาน · หาความยาวกับจุดกึ่งกลางด้วยการเดินกว้างสองรอบ
uu อีกรอบ ห้องที่ไกลที่สุดคือ w ระยะ u ถึง w คือความยาวของก้อนw ไปครึ่งหนึ่งของความยาว ปัดลง ก็ถึงจุดกึ่งกลาง
ทำไมรอบแรกจบที่ปลายของคู่ที่ไกลที่สุดเสมอ: ให้ a ถึง b เป็นคู่ที่ไกลที่สุด ถ้า u ไม่ได้เป็นปลายแบบนั้น
ทางจาก u มาชนทาง a ถึง b แล้วเดินต่อไปยังปลายที่ไกลกว่า จะได้ทางที่ยาวกว่า d เหตุผลเดียวกับเรื่องรัศมีข้างบน
เหตุผลนี้ใช้ได้เพราะต้นไม้มีทางเดียวระหว่างสองห้อง บนกราฟที่มีวงวิธีนี้อาจผิดโดยไม่มีอะไรเตือน รายละเอียดเต็มอยู่ใน DP บนต้นไม้ ฝึกข้อ 2
ลองเดินดูบนต้น 9 ห้อง ผังเดิมยาว 6 ในรูป เส้นประแดงคือเส้นที่ปิด สีฟ้ากับสีทองคือสองก้อนที่ได้
สิ่งที่ควรดู: บรรทัดคำอธิบายขึ้นต้นด้วยค่าของเส้นนี้ และบอกว่าเก็บหรือทิ้ง แล้วค่อยบอกว่าค่านั้นมาจากตัวไหนในสามตัวของสูตร
ปิดทีละเส้นบนต้น 9 ห้อง
| ปิด | ก้อนปลายแรก | ก้อนปลายสอง | ทางข้าม | ค่า |
|---|---|---|---|---|
1-2 | 3 | 3 | 5 | 5 |
1-3 | 6 | 0 | 4 | 6 |
2-4 | 3 | 2 | 4 | 4 |
1-5 | 5 | 1 | 5 | 5 |
4-6 | 4 | 1 | 4 | 4 |
5-7 | 5 | 0 | 4 | 5 |
6-8 | 5 | 0 | 4 | 5 |
1-9 | 6 | 0 | 4 | 6 |
ผังนี้ลดจาก 6 เหลือ 4 ได้ 2 เส้น คือ 2-4 กับ 4-6 โค้ดถือเส้นแรกที่เจอไว้ คือ 2-4 แถวที่ค่ามาจากก้อนที่ยาวเอง ต่อห้องไหนก็ไม่ช่วย
โค้ดของวิธีนี้วนทุกเส้น เดินกว้างสองรอบต่อก้อน แล้วเก็บเส้นที่ได้ค่าน้อยที่สุด นับงานต่อเส้นได้ดังนี้
รวมราว 7N ต่อเส้น มี N − 1 เส้น ทั้งหมดราว 7N²
ที่ N = 2,999 (ต้นไม้สุ่ม ช้าสุดในสามรูปทรงที่ลอง) ใช้ 0.21 วินาที ทันชุด 70%
แต่บนทางเดิน 30,000 ห้องใช้ไปแล้ว 19.88 วินาที งานคือ 7 × 30,000 × 29,999 ครั้ง เครื่องนี้ทำได้ราว 3.2×108 ครั้งต่อวินาที งบ 3 วินาทีคือราว 9.5×108 ครั้ง
ที่ N = 300,000 วิธีนี้ต้องใช้ราว 6.3×1011 ครั้ง เกินงบราว 663 เท่า ลองเทียบสามวิธี
วิธีที่ 1
ราว 3N² × (N³ − N)/6
ตัวตรวจของทั้งบท ไม่เชื่อสูตรอะไรเลย
ได้ 40 คะแนน
วิธีที่ 2
7N ต่อเส้น รวมราว 7N²
ตัดการลองคู่ห้องทิ้งด้วยสูตรของหนึ่งเส้น
ได้ 70 คะแนน
วิธีเต็ม
14N
รอบลงเก็บค่าที่มองลงไปข้างใต้แต่ละห้อง รอบขึ้นเก็บค่าที่มองขึ้นไปทางราก ได้ความยาวสองก้อนของทุกเส้น (ตอนที่ 4)
ได้ครบ 100 คะแนน
คิดย้อนว่างบพอให้ทำอะไรได้แค่ไหน: งบหารด้วยเส้น 299,999 เส้น เหลือราว 3,169 ครั้งต่อเส้น
แต่ก้อนหนึ่งมีได้เป็นแสนห้อง วัดก้อนใหม่ทุกเส้นเลยไม่ทัน ต้องได้ความยาวของสองก้อนของทุกเส้นมาจากงานก้อนเดียวที่ทำครั้งเดียว
ก่อนจะหาของทุกเส้นได้ ต้องมีวิธีเรียกชื่อสองก้อนให้เป็นระบบก่อน วิธีที่ใช้คือปักราก
v กับทุกห้องที่อยู่ใต้มันลงไปทุกอุโมงค์เชื่อมห้อง v หนึ่งห้องกับพ่อของมัน พอปิดอุโมงค์เส้นนั้น สองก้อนที่ได้คือกิ่งของ v กับส่วนที่เหลือทั้งหมด
ถ้ามีตัวเลขสองตัวเก็บไว้ที่ทุกห้อง คือความยาวของกิ่ง (เรียกว่า dd) กับความยาวของส่วนที่เหลือ (เรียกว่า ud)
ทุกเส้นก็ได้ d1 กับ d2 ทันที
ชื่อมาจากโค้ด ตัวหน้า d ย่อจาก down (มองลงไปในกิ่ง) ตัวหน้า u ย่อจาก up (มองขึ้นไปทางพ่อ) ตัวหลัง d คือ diameter และ h คือ height ความสูง
การคำนวณแบบนี้คือ DP (dynamic programming) คือเก็บคำตอบของชิ้นเล็กไว้ แล้วประกอบเป็นคำตอบของชิ้นใหญ่ พื้นฐานอยู่ใน DP บนต้นไม้
กิ่งของ v ประกอบจากกิ่งของลูกทั้งหมด ต้องคิดลูกให้เสร็จก่อนพ่อ ขาลงไล่จากใบขึ้นไปหาราก และเก็บสองค่า
ค่าของขาลง
h[v] ความสูงของกิ่ง: ทางลงจาก v ที่ยาวที่สุด ทางลงผ่านลูก c ยาว h[c] + 1dd[v] ความยาวของกิ่ง: มากสุดของ dd ของลูกทุกตัว (ทางที่ไม่ผ่าน v) กับสองทางลงยาวสุดต่อกันที่ vสิ่งที่ควรดู: ห้องสีทองคือห้องที่กำลังคิด สีเขียวคือลูกที่ส่งค่ามา บรรทัดคำอธิบายขึ้นต้นด้วย h กับ dd ของห้องนั้น แล้วบอกว่ามาจากลูกตัวไหน
ขาลง ไล่จากใบขึ้นราก
| ห้อง | ลูก | h | dd |
|---|---|---|---|
8 | ไม่มี | 0 | 0 |
6 | 8 | 1 | 1 |
7 | ไม่มี | 0 | 0 |
4 | 6 | 2 | 2 |
9 | ไม่มี | 0 | 0 |
5 | 7 | 1 | 1 |
3 | ไม่มี | 0 | 0 |
2 | 4 | 3 | 3 |
1 | 2, 3, 5, 9 | 4 | 6 |
ส่วนที่เหลือของ c คือทุกอย่างนอกกิ่งของ c มองจาก c ต้องขึ้นไปหาพ่อก่อน ค่าของ c คิดจากค่าของพ่อ ขาขึ้นไล่จากรากลงไปหาใบ
เริ่มจากพ่อที่มีลูกสองห้อง
ห้อง p มีลูก c กับ x ทางที่ออกจาก c ขึ้นไปหา p ไปต่อได้สองทาง คือขึ้นต่อจาก p (ยาว uh[p]) หรือลงไปในกิ่ง x (ยาว h[x] + 1)
uh[c] = 1 + มากสุดของ ( uh[p] , h[x] + 1 )
ถ้า p มีลูกหลายห้อง h[x] + 1 กลายเป็นทางลงจาก p ที่ยาวที่สุดโดยไม่เข้ากิ่ง c
คำว่าไม่เข้ากิ่ง c กำหนดว่าแต่ละห้องต้องเก็บอะไรไว้บ้าง
c: ถ้ากิ่ง c เป็นอันดับหนึ่งเอง ต้องใช้อันดับสองc: ถ้ากิ่ง c อยู่ในสองอันดับแรก ต้องใช้ถึงอันดับสาม ทางลงเก็บสามอันดับ พร้อมว่าอันดับหนึ่งกับสองเป็นของลูกคนไหนdd ที่มากสุดของลูกตัวอื่น: ถ้า c เป็นเจ้าของอันดับหนึ่ง ต้องใช้อันดับสอง dd เก็บสองอันดับ พร้อมเจ้าของอันดับหนึ่งค่าของขาขึ้น (ห้อง c มีพ่อ p)
uh[c] ทางที่ยาวที่สุดจาก c ที่ขึ้นไปทางพ่อก่อน = 1 + มากสุดของ uh[p] กับทางลงยาวสุดจาก p ที่ไม่เข้ากิ่ง cud[c] ความยาวของส่วนที่เหลือ = มากสุดของสามอย่างนี้ud[p]: ทางที่อยู่ในส่วนที่เหลือของ p ทั้งเส้นdd ที่มากสุดของลูกตัวอื่นของ p: ทางที่อยู่ในกิ่งพี่น้องกิ่งเดียวp คนละทางแล้วต่อกันที่ p โดยไม่เข้ากิ่ง c (ทางขึ้น uh[p] นับเป็นหนึ่งทาง)รากไม่มีอะไรอยู่ข้างบน uh กับ ud ของรากเป็น 0
นึกภาพ
นึกถึงการส่งข่าวในผังองค์กร หัวหน้า p รู้ข่าวจากเบื้องบน และรู้รายงานของลูกทีมทุกคน เวลาเล่าให้ลูกทีม c ฟังว่าโลกนอกทีมของเขาเป็นยังไง หัวหน้าเล่าข่าวเบื้องบนรวมกับรายงานของลูกทีมคนอื่น โดยข้ามรายงานของ c
ข่าวเบื้องบนคือ uh[p] กับ ud[p] รายงานของลูกทีมคือ h กับ dd ของลูกแต่ละคน และการข้ามรายงานของ c คือคำว่าไม่เข้ากิ่ง c
ในต้นนี้ ห้อง 1 มีทางลง 4, 2, 1 และกิ่ง 2 คืออันดับหนึ่ง ตอนคิดให้ห้อง 2 ต้องทิ้งอันดับหนึ่ง แล้วใช้อันดับสองกับสาม (2 กับ 1)
สิ่งที่ควรดู: ห้องสีทองคือห้องที่กำลังคิด สีเขียวคือส่วนที่เหลือของมัน เส้นประแดงคือเส้นที่แถวนี้ตอบ บรรทัดคำอธิบายขึ้นต้นด้วย uh, ud และสองก้อนที่ได้ แล้วค่อยแจกแจงว่าแต่ละค่ามาจากไหน
ขาขึ้น ไล่จากรากลงใบ
| ห้อง (พ่อ) | uh | ud | ปิดเส้นนี้ได้ก้อน |
|---|---|---|---|
2 (1) | 3 | 3 | 3 กับ 3 |
3 (1) | 5 | 6 | 0 กับ 6 |
5 (1) | 5 | 5 | 1 กับ 5 |
9 (1) | 5 | 6 | 0 กับ 6 |
4 (2) | 4 | 3 | 2 กับ 3 |
7 (5) | 6 | 5 | 0 กับ 5 |
6 (4) | 5 | 4 | 1 กับ 4 |
8 (6) | 6 | 5 | 0 กับ 5 |
แถวของห้อง 4 ให้ก้อน 2 กับ 3 ตรงกับเส้นที่ชนะในเครื่องเดินปิดทีละเส้น ตอนสร้างหน้า ทุกแถวของทั้งสองตารางถูกเทียบกับการเดินกว้างวัดสองก้อนจริง
ขาลงกับขาขึ้นให้แค่ตัวเลข ยังไม่รู้ว่าจุดกึ่งกลางของแต่ละก้อนอยู่ห้องไหน และไม่จำเป็นต้องรู้ เพราะสูตรเลือกเส้นได้จากตัวเลขอย่างเดียว
พอรู้เส้นที่ชนะแล้ว ค่อยเดินกว้างสองรอบต่อก้อนครั้งเดียว เพื่อหาห้องที่จะต่อ นับงานทั้งโปรแกรมได้ดังนี้
รวม 14N ราว 4.2×106 ครั้งที่ N เต็ม ต่ำกว่างบราว 226 เท่า
กรณีขอบ: N = 1 ไม่มีอุโมงค์ให้ปิด โจทย์ยังอนุญาตค่านี้ โค้ดพิมพ์ 0 บรรทัดเดียว ส่วน N = 2 มีอุโมงค์เส้นเดียว ปิดแล้วเปิดเส้นเดิมกลับ ได้ 1
ระวัง · ความลึกของต้นไม้
ต้นไม้สามแสนห้องอาจเป็นทางเดินยาวสามแสนห้อง ถ้าเขียนขาลงด้วยฟังก์ชันที่เรียกตัวเองซ้ำ สแต็กของระบบจะเต็มก่อนได้คำตอบ
โค้ดนี้เรียงห้องด้วยการเดินกว้างเก็บไว้ในอาร์เรย์ แล้วไล่อาร์เรย์ย้อนหลังแทนขาลง ไล่ไปข้างหน้าแทนขาขึ้น
| ส่วนในโค้ด | อธิบายอยู่ที่ |
|---|---|
| bfs (เดินกว้างโดยข้ามเส้นที่ปิด) | เดินกว้างสองรอบ ในตอนที่ 3 |
| เรียงแบบกว้างก่อนแล้วไล่ย้อน (ord_) | ตอนที่ 5 (กล่องเรื่องความลึกของต้นไม้) |
| ขาลง h, dd | ตอนที่ 4 ขาลง |
| ขาขึ้น uh, ud (ทางลงสามอันดับ a1..a3 พร้อมเจ้าของ i1, i2 และ dd สองอันดับ d1, d2 พร้อมเจ้าของ j1) | ตอนที่ 4 ขาขึ้น |
| for v = 2..N เลือกเส้นด้วยสูตร | ตอนที่ 2 (สูตรของหนึ่งเส้น) |
| centerOf (หาจุดกึ่งกลางของเส้นที่ชนะ) | ตอนที่ 5 |
ตรวจอะไรไปแล้วบ้าง
นี่คือการตรวจ ส่วนที่ครอบคลุมทุกขนาดคือเหตุผลเรื่องทางสามแบบกับรัศมี ขาลงขาขึ้นตรวจแล้วแต่ไม่ได้พิสูจน์
| รูปทรง | วินาที | เมกะไบต์ |
|---|---|---|
| ทางเดินยาวเส้นเดียว | 0.06 | 20.1 |
| ดาว (ห้องกลางหนึ่งห้อง ที่เหลือเป็นใบ) | 0.06 | 21.7 |
| ต้นไม้สุ่ม | 0.22 | 20.5 |
| หนอนผีเสื้อ (ทางยาวครึ่งหนึ่ง มีใบห้อยตามทาง) | 0.11 | 20.1 |
| ไม้กวาด (ทางยาวครึ่งหนึ่ง ปลายเป็นดาว) | 0.07 | 20.5 |
| ต้นไม้ที่ทุกห้องมีลูกไม่เกินสอง | 0.07 | 20.2 |
ห้องที่ต่อมีผลแค่กับทางข้าม เลยตัดการลองคู่ทิ้งได้ เหลือหาความยาวสองก้อนของทุกเส้นด้วยสองรอบ ลงกับขึ้น
ในหน้านี้