ลองพิจารณาคำถามรอบรหัส 1C ของ Google Jamต่อไปนี้:
กำแพงเมืองจีนเริ่มออกเป็นสายที่ไม่มีที่สิ้นสุดที่ความสูงในสถานที่ทั้งหมดเป็น0
ชนเผ่าจำนวนหนึ่ง ,จะโจมตีกำแพงตามพารามิเตอร์ต่อไปนี้ - วันเริ่มต้น, , กำลังเริ่มต้น , พิกัดทิศตะวันตกเริ่มต้น,และพิกัดทิศตะวันออกเริ่มต้น, . นี้การโจมตีครั้งแรกเกิดขึ้นในวันในช่วงที่แข็งแรงSหากมีส่วนใดของกำแพงภายในที่มีส่วนสูงการโจมตีจะสำเร็จและในตอนท้ายของวันกำแพงจะถูกสร้างขึ้นเพื่อให้ส่วนใดส่วนหนึ่งของมันภายในของความสูงนั้นจะอยู่ที่ความสูงD [ W , E ] S [ W , E ] < S [ W , E ] < S S (หรือมากกว่านั้นหากการโจมตีอื่น ๆ ในวันนั้นโจมตีกลุ่มเดียวกันด้วยความแข็งแกร่ง )
แต่ละเผ่าจะทำการโจมตีได้มากถึงครั้งก่อนที่จะถอยออกไป ทุกเผ่ามี ,และที่กำหนดลำดับของการโจมตี: จะรอวันระหว่างการโจมตีพวกเขาจะย้ายช่วงการโจมตีหน่วยสำหรับการโจมตีแต่ละครั้ง (ลบ = ตะวันตกบวก = ตะวันออก) แม้ว่าขนาดของช่วงจะยังคงเหมือนเดิมและความแข็งแกร่งของพวกเขาจะเพิ่ม / ลดลงตามค่าคงที่หลังจากการโจมตีแต่ละครั้งδ D δ X δ S δ D ≥ 1 δ X
เป้าหมายของปัญหาคือให้คำอธิบายที่สมบูรณ์เกี่ยวกับชนเผ่าที่ถูกโจมตีกำหนดว่าการโจมตีของพวกเขาจะประสบความสำเร็จเพียงใด
ฉันจัดการเพื่อเขียนรหัสโซลูชันที่ใช้งานได้ทำงานในประมาณ 20 วินาที: ฉันเชื่อว่าโซลูชันที่ฉันติดตั้งใช้เวลาเวลาโดยที่จำนวนการโจมตีทั้งหมดใน การจำลอง (สูงสุด ) และจำนวนทั้งหมดของจุดขอบที่ไม่ซ้ำกันในช่วงการโจมตี (สูงสุด )= 1000000 X =
ในระดับสูงโซลูชันของฉัน:
- อ่านข้อมูลเผ่าทั้งหมด
- คำนวณ -coordinates ที่ไม่ซ้ำกันทั้งหมดสำหรับช่วงการโจมตี - O ( A )
- แสดง Wall เป็นต้นไม้ไบนารีที่ได้รับการปรับปรุงอย่างขี้เกียจในช่วงที่ติดตามค่าความสูงต่ำสุด leaf คือช่วงของพิกัดXสองจุดโดยไม่มีสิ่งใดอยู่ในระหว่างและโหนดพาเรนต์ทั้งหมดแสดงช่วงเวลาต่อเนื่องที่ครอบคลุมโดยลูก ๆ - O ( X log X )
- สร้างการโจมตีทั้งหมดที่ทุกเผ่าจะดำเนินการและเรียงลำดับตามวันที่ -
- สำหรับการโจมตีแต่ละครั้งดูว่าจะสำเร็จหรือไม่ ( เวลาการสืบค้นX ) เมื่อวันที่มีการเปลี่ยนแปลงวนลูปผ่านการโจมตีที่ประสบความสำเร็จทั้งหมดที่ยังไม่ได้ประมวลผลและปรับปรุงวอลล์ให้สอดคล้องกัน ( บันทึกเวลาอัพเดตXสำหรับการโจมตีแต่ละครั้ง) - O ( A log X )
คำถามของฉันคือ: มีวิธีที่จะทำได้ดีกว่าหรือไม่? บางทีมีวิธีการเชิงกลยุทธ์ที่จะใช้ประโยชน์จากลักษณะเชิงเส้นของการโจมตีต่อเนื่องของชนเผ่าหรือไม่? 20 วินาทีรู้สึกยาวเกินไปสำหรับโซลูชันที่ตั้งใจไว้ (แม้ว่า Java อาจถูกตำหนิสำหรับเรื่องนั้น)