Signal Strength

o59_may03_signal

ในข้อนี้เราเขียนระยะห่างระหว่าง access point ii และ access point jj ด้วย d(i,j)d(i, j) ซึ่งเราจะนิยามให้ d(i,j)=(xixj)2+(yiyj)2d(i, j) = (x_i-x_j)^2 + (y_i-y_j)^2

สมมติก่อนว่าเรารู้ค่า PP แล้ว ค่า a[i][j]a[i][j] ซึ่งบอกว่า access point ii คุยกับ access point jj ได้ไหม ควรจะมีค่าเป็น 11 ก็ต่อเมื่อ d(i,j)P2d(i, j) \leq P^2 เท่านั้น มิเช่นนั้นควรจะมีค่าเป็น 00

หากเรานำค่า a[i][j]a[i][j] จริงทั้งหมดมาเรียงกันจากน้อยไปมากตามค่า d(i,j)d(i, j) ที่เกี่ยวข้องกับมัน จะได้ลำดับใหม่คือ S1,S2,S3,...,SmS_1, S_2, S_3, ..., S_m (m=m = จำนวนข้อมูล) เราจะได้ว่า จะมี index kk โดย 0km0 \leq k \leq m ที่ Si=1S_i = 1 สำหรับ 1ik1 \leq i \leq k และ Si=0S_i = 0 สำหรับ k<imk< i \leq m กล่าวคือลำดับจะเป็นเลข 11 ตลอดไปจนถึงจุด ๆ หนึ่ง แล้วเปลี่ยนเป็น 00 ตลอดจนจบลำดับ (หรืออาจจะไม่มี 11 เลยก็ได้)

ดังนั้นเพื่อที่จะหาคำตอบที่ดีที่สุด เราจะสร้างลำดับ TT โดยวิธีคล้ายกับการสร้างลำดับ SS ข้างต้น แต่เราจะใช้ค่า a[i][j]a[i][j] ที่โจทย์ให้มาแทน จากนั้นเราจะไล่เทียบกับ SS ที่เป็นไปได้ทั้งหมดโดยการเปลี่ยนค่า kk ไปเรื่อย ๆ จาก k=0k=0 ถึง k=mk=m (ซึ่ง kk คือจุดสุดท้ายที่ลำดับ SS มีค่าเป็น 11) แล้วในแต่ละครั้งของการไล่ เราจะคำนวณหาจำนวนสมาชิกของ TT ที่ไม่เหมือน SS คำตอบของเราจะมีค่าเท่ากับค่าที่น้อยที่สุดของจำนวนที่สมาชิกที่ต่างกันในแต่ละครั้งของการไล่

แต่ข้อนี้มีข้อควรระวังคือ เราจะไม่สามารถใช้ kk บางค่าได้ เนื่องจากอาจจะมีกรณีที่ระยะทางมีค่าเท่ากัน ยกตัวอย่างเช่น ลำดับ TT ของเราอาจจะมีค่า d(i,j)d(i, j) ที่สอดคล้องเท่ากับ 10,25,30,30,30,45,6010, 25, 30, 30, 30, 45, 60 สังเกตว่าถ้าเราให้ k=3k = 3 จะได้ว่า 30P230 \leq P^2 และ 30>P230 > P^2 ในเวลาเดียวกัน ซึ่งไม่สามารถเป็นไปได้ ดังนั้นเวลาไล่ค่า kk ให้เราข้าม index พวกนี้ไปเลย

ในการคำนวณหาจำนวนสมาชิกที่ต่าง ให้เราเก็บจำนวนของ 00 จนถึงตำแหน่ง kk เพื่อใช้ในการคำนวณคำตอบ จากนี้ เราสามารถคำนวณจำนวนของ 11 หลังตำแหน่ง kk ได้ด้วย ดังนั้นเราก็จะสามารถคำนวณคำตอบในแต่ละครั้งของการเปลี่ยนค่า kk ได้เร็ว ๆ

time complexity ของวิธีนี้จะเท่ากับ O(n2logn)\mathcal{O}(n^2 \log n) จากการ sort ลำดับ TT ซึ่งมีความยาวเท่ากับ m=n2m = n^2