κ°μΈμ μΌλ‘ 곡λΆνλ€κ° κ·Έ μ¬νν¨κ³Ό λ°μμ 좩격먹μ μκ³ λ¦¬μ¦ 1μμ (2023/07 κΈ°μ€)
Mo's Algorithm
μ λ΄κ° μ΄ν΄ν μμλλ‘ νλ² μ 리ν΄λ³΄κ³ μ νλ€.
Offline Queryκ° κ°λ₯ν΄μΌ ν¨, μλμ κ°μ΄ 쿼리 μ λ ¬
struct Q { // Queryint s, e;int oidx; // Original Indexbool operator<(const struct Q& t) const {if (e / sqrtN == t.e / sqrtN) return s < t.s;return e / sqrtN < t.e / sqrtN;}};
λ κ°μΈμ μΌλ‘ bucket
μ νμ©ν νμ΄λ₯Ό λ§€μ° μ’μνλ€. μκ³ λ¦¬μ¦ λͺ
μΌλ‘λ Sqrt Decomposition
μΌλ‘ λ§μ΄ λΆλ₯΄λ κΈ°λ²μΈλ°, μ 체 λ°°μ΄ ν¬κΈ°κ° μΌλ, μ 체 ꡬκ°μ μΌλ‘ λλκ² λλ©΄, κ° bucket
μ ν¬κΈ° λν μ΄ λλ€. μ΄λ κ² λλ©΄, κ° κ΅¬κ°λ§λ€μ κ³μ°κ°(μ΄λ₯Όν
λ©΄ ꡬκ°λ§λ€μ ν©)μ ꡬνλ λ°μ μ΅λ μ μκ°μ΄ κ±Έλ¦¬κ² λλ μλ¦λ€μ΄ κ²°λ‘ μ λλ¬νλ€.
μλ₯Ό λ€μ΄, μ 체 κ΅¬κ° ν¬κΈ°κ° 10000
μ΄λ©΄, κ° κ΅¬κ°μ 100
μΌλ‘ λλ μ μκ³ , μ΄ μνμμ κ° κ΅¬κ°μ ν©μ bucket[i/100]
μ 미리 κ³μ°ν΄ λμλ€κ³ νμ. κ·Έλ¬λ©΄, ꡬκ°μ ν©μ 미리 κ³μ°ν΄λ κ°λ€μ λ°νμΌλ‘ μλμ²λΌ ꡬνλ©΄ λλ€.
μμμ νμΈμ΄ κ°λ₯ν κ²μ²λΌ, bucket μΈμ ꡬκ°μ ν©ν΄μΌ νλ μλ worstμ κ²½μ°μλ μ λμ§ μλλ€. λ°λΌμ μ΄λ° κ²½μ° query
λ§λ€μ μκ° λ³΅μ‘λλ μ΅λ μ΄ λλ€κ³ ν μ μλ κ²μ΄λ€.
λ°λ‘ μ΄λ¬ν 루νΈλ‘ λλλ μμ΄λμ΄λ₯Ό Offline query
μ μ μ©ν κ²μ΄ Mo's Algorithm
μ΄λ€. Offline query
μμ λ°μμ΄ λ
νΉνλ°, query
λ₯Ό κΌ μ
λ ₯μ΄ λ€μ΄μ¨ μμλλ‘ μ²λ¦¬νμ§ μλ κ²μ λ§νλ€. λ§μ½ μλμ κ°μ query
κ° λ°λ³΅λλ€κ³ ν΄λ³΄μ.
λ± λ΄λ query
λ₯Ό μ¬λ°°μΉνκ³ μΆμ μκ΅¬κ° μκΈΈ κ²μ΄λ€. μ¬λ°°μΉνλ©΄ μ΄μ μ κ³μ°ν κ°μ νμ©ν μ¬μ§κ° μκΈ° λλ¬Έμ΄λ€. λ€λ§, μ¬λ°°μΉλ₯Ό μΌλ°μ μΌλ‘
μ΄λ€ μμλ‘ ν κ²μΈμ§κ° λ§λ§νλ€. Sqrt Decomposition
κΉμ§λ 루νΈλ₯Ό μ΄λ»κ² νμ©ν μ§μ λν μμ΄λμ΄κ° μ΄λ μ λ μ§κ΄μΌλ‘ μ°Ύμμ§μ§λ§, Mo's
μ λ λλ©΄ μ½μ§ μλ€. μ¬λ°°μΉ λ°©μμ λν΄ μλμ²λΌ μκ°μ ν΄λ³΄λ κ²μ΄ μΌλ°μ μΌ κ²μ΄λ€.
s
λ¨Όμ μ λ ¬νλ©΄?
e
λ¨Όμ μ λ ¬νλ©΄?
s
λ¨Όμ μ λ ¬νκ³ κ°μΌλ©΄ e
λ‘ μ λ ¬νλ©΄?
μ¦, μμ²λΌ λ¨μ μ λ ¬ ν΄μλ μ΄λ»κ² μ λ ¬ν΄λ μ½μ§ μλ€. Mo's Algorithm
μ μμ²λ λ°μμμ μΆλ°νλλ°, λ°λ‘ νμͺ½ ꡬκ°μ 루νΈλ₯Ό μ·¨νλ κ²μ΄λ€. μλμ κ°μ operator
λ₯Ό ν΅ν΄ μ λ ¬νλ κ²μ μκ°ν΄λ³΄μ.
bool operator<(const struct Q& t) const {if (e / sqrtN == t.e / sqrtN) return s < t.s;return e / sqrtN < t.e / sqrtN;}
κ° κ°μ λ λ₯Ό νμ©ν΄ μ€λ¦μ°¨μμΌλ‘ νκ³ , λ€λ₯Ό λλ κ° μ€λ¦μ°¨μμΌλ‘ μ λ ¬νλ κ²μ΄λ€. μ΄λ κ² νλ©΄, μ²μμ μμκ° μλμ²λΌ κΉλνκ² λ¨μ΄μ§λ€. (μ κ°μ νμ)
e
κ° bucket
1μ μνλ―λ‘ μ μΌ λ¨Όμ μ¨λ€.bucket
μ΄κ³ , s
μ μμμ λ°λΌ μ λ ¬λμλ€.e
κ° bucket
13μ μνλ―λ‘ 1λ²λ³΄λ€ λμ€μ μ¨λ€.μ§κ΄μΌλ‘ νμΈν΄λ΄λ, query
κ° μ΄λν λ 걸리λ μκ°μ΄ μλΉν κ°μ μ΄ λ κ²μ΄λΌκ³ μ§μν μ μλ€. s
μ e
κ° μ΄λνλ μ 체μ μΈ κ±°λ¦¬λ₯Ό μκ°ν΄λ³΄μ.
e
λ μ 체μ μΌλ‘λ , κ·Έλ¦¬κ³ query
κ΅¬κ° λ΄μμ λ§νΌ μ΄λ κ°λ₯νκ³ , query
μκ° κ°λΌκ³ νλ©΄, μ΄ λ§νΌ μ΄λν μ μλ€.s
λ e
κ° μ΅λ λ§νΌ μ΄λνλ λμ μ€λ¦μ°¨μ μ λ ¬λμ΄ μμΌλ―λ‘ μ΅λ λ§νΌ μ΄λκ°λ₯νλ€. μ¦, μ΄ λ§νΌ μ΄λν μ μλ€.1κ³Ό 2λ₯Ό λ λ€ κ³ λ €νλ©΄ μ΅μ’ μ μΈ μκ° λ³΅μ‘λμΈ μ΄ λμ¨λ€.
νλμ query
λ₯Ό μννλ λ°μ 걸리λ μκ°μ΄ μ΄ κ±Έλ¦°λ€λ©΄, μ 체μ μΈ μκ°λ³΅μ‘λλ μμμ μ΄ν΄λ³Έ κ²μ²λΌ μ΄ λλ€. naive
νκ² μ 체 query
λ₯Ό μ²λ¦¬νλ€λ©΄ μ΄ κ±Έλ Έμ κ²μ΄λ―λ‘, μμ²λ κ°μ μ΄ λλ€κ³ ν μ μλ€.
Mo's Algorithm
μκ°: https://infossm.github.io/blog/2019/02/09/mo's-algorithm/μμ΄κ³Ό 쿼리 5
: https://www.acmicpc.net/problem/13547