อุปกรณ์แปลภาษา

thaco_translator

Abridged Problem Statement

กำหนดอาร์เรย์ pp เป็นอาร์เรย์ของการเรียงสับเปลี่ยนของตัวเลขตั้งแต่ 11 ถึง NN ให้ฟังก์ชัน f:NNf:\mathbb{N}\to\mathbb{N} โดยที่ f(x)=pxf(x)=p_x สำหรับจำนวนเต็มบวก xx ตั้งแต่ 11 ถึง NN ให้ g:N2Ng:\mathbb{N}^2\to\mathbb{N} โดยที่ g(x,y)=1g(x,y)=1 สำหรับ f(y)=xf(y)=x และ g(x,y)=g(x,f(y))+1g(x,y)=g(x,f(y))+1 สำหรับ f(y)xf(y)\neq x

หรือก็คือฟังก์ชันที่หาจำนวนชั้นที่น้อยที่สุดของ (fff)(x)(f\circ f\circ\dots\circ f)(x) ที่ทำให้ (fff)(x)=x(f\circ f\circ\dots\circ f)(x)=x เรานิยามให้ M=max(g(1,1),g(2,2),g(3,3),,g(N1,N1),g(N,N))M=\max (g(1,1),g(2,2),g(3,3),\dots,g(N-1,N-1),g(N, N)) เรามีคำถามอยู่ QQ คำถาม แต่ละคำถามจะถามว่า สมมติว่าเราสามารถสลับที่ค่าในตำแหน่ง i,ji,j ใด ๆ บนอาร์เรย์ pp ได้ไม่เกิน kk ครั้ง เราจะสามารถทำให้ MM มีค่าน้อยที่สุดได้เท่าไหร่

Observation 1

หากว่า pi=ipi=i สำหรับ ii ตั้งแต่ 11 ถึง NN แล้ว MM จะมีค่าเท่ากับ 11 โดยทันทีซึ่งน้อยที่สุดเท่าที่จะทำได้ และเราสามารถสลับไม่เกิน N1N-1 รอบเพื่อให้ทำให้ pi=ip_i=i ดังนั้นสำหรับค่า kk ที่เกิน N1N-1 นั้น จะมีค่า 11 โดยทันที

Observation 2

พิจารณากราฟมีทิศทางขนาด NN ที่สร้างจาก pp โดยให้โหนดที่ ii มีเส้นเชื่อมไปยังโหนดที่ pip_i เราจะสามารถแบ่งกราฟเป็นกราฟที่มีหน้าตาเป็นวงวนได้ ซึ่งค่าของ g(x,x)g(x,x) จะเท่ากับความยาวของวงวนของ xx และทุก ๆ ii ซึ่งอยู่ในวงวนเดียวกับ xx จะมีคุณสมบัติที่ g(i,i)=g(x,x)g(i,i)=g(x,x) ดังนั้นเราจะหาค่า MM ได้ใน O(N)O(N) โดยการหาความยาวแต่ละวงวน และเก็บไว้ว่าวงวนไหนที่เคยไปแล้วบ้าง

Observation 3

สำหรับ xx บนอาร์เรย์ pp ถ้า ff(x)xf\circ f(x)\neq x แล้ว หากเราสลับค่าในตำแหน่ง xx กับตำแหน่ง ff(x)f\circ f(x) แล้ว วงวนเดิมจะแตกเป็นสองวงวนที่มีขนาด 22 และขนาด C2C-2 เมื่อ CC เป็นขนาดของวงวนเดิม ซึ่งเราจะสังเกตได้ว่าถ้าเราสลับค่าใน ตำแหน่ง (fff)(x)l\underbrace{(f\circ f\circ\dots\circ f)(x)}_{l} กับ xx หาก l<Cl<C เราจะสามารถแบ่งวงวนออกเป็น 22 วงซึ่งมีขนาด ll และ ClC-l ตามลำดับ

Subtask 1

เราจะสร้างอาร์เรย์ dpdp โดยที่ dp(i)=dp(i)= ค่า MM ที่น้อยที่สุดที่มีการสลับที่ไม่เกิน ii ครั้ง ซึ่งตอนแรกเราจะให้เป็น N+1N+1 ทุกช่อง พิจารณาทุกการเรียงสับเปลี่ยนที่เป็นไปได้ เราจะหาจำนวนครั้งที่ต้องสลับตัวใน pp เพื่อให้ได้การเรียงสับเปลี่ยนที่กำลังพิจารณา ขอแทนด้วย rr ซึ่งทำได้โดยการที่ไล่จาก 11 ถึง NN หากที่ตำแหน่ง ii นั้นเราพบว่า pirip_i\neq r_i เราจะสลับค่าที่ตำแหน่ง ii ใน pp กับค่าที่ตำแหน่งที่ jj ซึ่ง pj=rip_j=r_i เราสามารถพิสูจน์ได้ว่า j>ij>i และวิธีนี้ใช้การสลับเพื่อเปลี่ยนจาก pp เป็น rr น้อยที่สุดเสมอ ให้จำนวนครั้งที่ต้องสลับมีค่า xx หลังจากนั้นเราจะหาค่า MM ของ rr ซึ่งขอแทนด้วย AA เราจะแก้ไข ให้ dp(x)=min(dp(x),A)dp(x)=\min(dp(x),A) หลังจากที่เราพิจารณาทุกการเรียงสับเปลี่ยนแล้ว เราจะไล่จาก 11 ถึง NN และกำหนดให้ dp(i)=min(dp(i1),dp(i))dp(i)=\min(dp(i-1),dp(i)) แล้วก็ตอบทุกคำถามใน O(1)O(1)

Time Complexity: O(NN!+Q)\mathcal{O}(N\cdot N!+Q)

Subtask 2

จาก Observation 3 เราจะสามารถเปลี่ยนโจทย์ได้เป็น ในคำถามที่ ii เราจะหาจำนวนเต็มบวก UU ที่น้อยที่สุด ซึ่งทำให้มีจำนวนเต็มบวก ll และ a1,a2,,ala_1,a_2,\dots,a_l ซึ่ง lkil\leq k_i และ a1,a2,,alUa_1,a_2,\dots,a_l\leq U และ a1+a2++al=Na_1+a_2+\dots + a_l=N ซึ่งคำตอบของคำถามนี้คือ Nki+1\lceil\frac{N}{k_i+1}\rceil

Time Complexity: O(N+Q)\mathcal{O}(N+Q)

Subtask 3

ค่า MM จาก pp ที่รับเข้ามาจะเป็น 22 เสมอ ซึ่งเราสามารถลดให้เหลือ 11 ได้ด้วยจำนวนครั้งที่น้อยที่สุดคือ N2\frac{N}{2} ครั้ง โดยการสลับค่าที่ตำแหน่ง 2i12i-1 กับตำแหน่งที่ 2i2i สำหรับ ii ตั้งแต่ 11 ถึง N2\frac{N}{2} ดังนั้นสำหรับแต่ละคำถาม จะมีแค่สองคำตอบคือ M=2M=2 สำหรับ ki<N2k_i<\frac{N}{2} และ M=1M=1 สำหรับ kiN2k_i\geq\frac{N}{2}

Time Complexity: O(N+Q)\mathcal{O}(N + Q)

Subtask 4

จาก Observation 3 และ Subtask 2 เราจะได้ว่าเราสามารถแปลงปัญหาได้เป็น ในคำถามที่ ii หาก pp นั้นประกอบด้วยวงวนขนาด C1,C2,C3,,CvC_1,C_2,C_3,\dots,C_v เราจะหาค่า MM ที่น้อยที่สุดซึ่งทำให้เราสามารถแบ่ง CiC_i ออกเป็น lil_i ส่วน ส่วนละไม่เกิน UU และ l1+l2++lvkil_1+l_2+\dots+l_v\leq ki ซึ่งเราสามารถ binarybinary searchsearch เพื่อหาคำตอบได้ โดยเรา binarybinary searchsearch ตามค่า UU ว่า ที่ค่า UU เท่านี้เราจะแบ่งตามเงื่อนไขได้หรือไม่ ซึ่งสำหรับ CiC_i ใด ๆ หากต้องการแบ่งให้ทุกส่วนมีค่าไม่เกิน UU จะใช้ทั้งหมด CiU1\lceil\frac{C_i}{U}\rceil-1 เหตุผลที่เราสามารถ binary search ได้นั้นเพราะบนค่า kk ที่เพิ่มขึ้นนั้นค่า UU จะไม่มีทางเพิ่มขึ้นแน่นอน

Time Complexity: O(NQlogN)\mathcal{O}(NQ\log{N})

Subtask 5

เราจะมีอาร์เรย์ dpdp ซึ่ง dp(i)dp(i) เท่ากับจำนวนครั้งที่น้อยที่สุดที่เราจะสามารถสลับแล้วทำให้ค่า MM มีค่าไม่เกิน ii ซึ่งเราจะสามารถคำนวณ dp(i)dp(i) โดยให้ตอนแรก dp(i)=0dp(i)=0 สมมติว่า pp นั้นประกอบด้วยวงวนขนาด C1,C2,C3,,CvC_1,C_2,C_3,\dots,C_v เราจะทำขั้นตอนดังต่อไปนี้

for j in (1, 2, ..., v) do
    for i in (1, 2, ..., C[j]) do
        dp[i] = dp[i] + ceil(C[j] / i) - 1
    end for
end for

ซึ่งค่า dp(i) ที่ได้หลังจบลูปนั้นจะเป็นตามนิยามที่ให้ไว้ และลูปนี้ทำงานใน O(N)O(N) หลังจากที่เราได้ค่า dpdp แล้วในคำถามที่ ii เราจะ binary search หาค่า jj ที่น้อยที่สุดที่ทำให้ dp(j)kidp(j)\leq k_i

Time Complexity: O(N+QlogN)\mathcal{O}(N+Q\log{N})