มัธยฐาน (Median)

1110

ข้อนี้ต้องการหาว่าสำหรับอาเรย์ A[1..N]A[1..N] ที่มีค่าตั้งแต่ 11 ถึง NN แบบไม่ซ้ำกัน จะมีกี่คู่ (l,r)(l,r) ที่ A[l..r]A[l..r] มีค่ามัธยฐานเท่ากับ kk

เคส N1000N \leq 1000

จากนิยามของมัธยฐานจะสังเกตได้ว่า kk จะต้องอยู่ใน A[l..r]A[l..r] และใน A[l..r]A[l..r] จะมีจำนวนค่าที่มากกว่า kk เท่ากับจำนวนค่าที่น้อยกว่า kk

กำหนดให้ xx เป็นดัชนีที่ทำให้ A[x]=kA[x]=k และนิยาม C[i]=(A[i]>k)(A[i]<k)C[i] = (A[i] > k) - (A[i] < k) กล่าวคือ C[i]C[i] เป็น 11 เมื่อ A[i]>kA[i] >k และ 1-1 เมื่อ A[i]<kA[i] <k

โจทย์จะกลายเป็นการหาจำนวนคู่ (l,r)(l,r) ที่ทำให้ Σi=lxC[i]+Σi=xrC[i]=0\Sigma_{i=l}^{x} C[i] + \Sigma_{i=x}^r C[i]= 0 ซึ่งหมายความว่าใน A[l..r]A[l..r] มีจำนวนที่มากกว่า kk และน้อยกว่า kk เท่ากัน

นิยาม SL[l]=Σi=lxC[i]SL[l]=\Sigma_{i=l}^{x} C[i] และ SR[r]=Σi=xrC[i] SR[r]=\Sigma_{i=x}^r C[i] จะได้ว่า NSL[l]N-N \leq SL[l] \leq N และ NSR[l]N-N \leq SR[l] \leq N เพราะมีได้อย่างมาก NN ตัวที่มากกว่าหรือน้อยกว่า kk

สำหรับเคส n1000 n \leq 1000 สามารถไล่ทุกคู่ (l,r)(l,r) ที่ lxr l \leq x \leq r ได้โดยตรงและตรวจสอบว่า SL[l]+SR[r]=0SL[l] + SR[r] =0 หรือไม่สำหรับแต่ละคู่

การคำนวณค่า C[1..N]C[1..N] SL[1..x]SL[1..x] และ SR[x..N]SR[x..N] ใช้เวลา O(N)\mathcal{O}(N) การเช็คแต่ละคู่ (l,r)(l,r) ใช้เวลา O(N2)\mathcal{O}(N^2)

เคส N1000000N \leq 1000000

เมื่อกำหนัด LsL_s เป็นจำนวน ll ที่ทำให้ SL[l]=sSL[l]=s และ RsR_s เป็นจำนวน rr ที่ทำให้ SR[r]=s SR[r] =s จะได้ว่าคำตอบคือ s=NNLsRs\sum_{s=-N}^N L_sR_{-s} (เพราะเมื่อ SL[l]=sSL[l] =s และ SR[r]=s SR[r] =-s จะได้ว่า Σi=lxC[i]+Σi=xrC[i]=ss=0\Sigma_{i=l}^{x} C[i] + \Sigma_{i=x}^r C[i]= s - s = 0)

เราสามารถคำนวณ LsL_s ได้โดยการไล่คำนวณ SL[l]SL[l] ตั้งแต่ l=xl=x ไปจนถึง l=1l=1 และเพิ่ม LsL_s ทุกครั้งที่ SL[l]=sSL[l] = s โดยเริ่มจาก SL[x]=0SL[x] = 0 และคำนวณ SL[l]=SL[l+1]+C[l]SL[l] = SL[l+1] + C[l] สำหรับ ll ต่อๆ ไป สามารถใช้วิธีในทำนองเดียวกันในการคำนวณ RsR_s โดยคำนวณ SR[r]SR[r] เริ่มจาก r=xr=x ไปจนถึง r=Nr=N

Time Complexity: การคำนวณ SL[1..x]SL[1..x] และ SR[x..N]SR[x..N] เพื่อคำนวณ LsL_s และ RsR_s ใช้เวลารวมกัน O(N)\mathcal{O}(N) และการคำนวณ s=NNLsRs\sum_{s=-N}^N L_sR_{-s} ใช้เวลา O(N)\mathcal{O}(N) ทั้งหมดจึงใช้เวลา O(N)\mathcal{O}(N)