Scenery
Β - Last update: 2023-10-25

Scenery

ICPC 유λͺ… 문제 Scenery 에 λŒ€ν•œ 풀이 정리

μ•„λž˜ 글은 koosaga 글을 λ‚΄κ°€ μ΄ν•΄ν•œ λΆ€λΆ„λ§Œ μ •λ¦¬ν•œ 것이닀. (증λͺ…λ§Œ 빠지고 거의 κ·ΈλŒ€λ‘œλ‹€)

Forbidden Regions

Scenery 문제 ν’€μ΄μ˜ 핡심이 λ˜λŠ” κ°œλ…. T=1T = 1 일 κ²½μš°μ—λŠ” 항상 λ°λ“œλΌμΈμ΄ μž‘μ€ 일을 ν• λ‹Ήν•˜λŠ” 것이 μ΅œμ μ΄λ‹€.

  • Exchange Argumentλ₯Ό μ‚¬μš©ν•˜λ©΄ μ‰½κ²Œ 보일 수 μžˆλ‹€.
  • μ–΄λ–€ μ‹œμ μ—μ„œ 일을 ν•˜κ² λ‹€κ³  ν–ˆμ„ λ•Œ λ°λ“œλΌμΈμ΄ 큰 일을 μ„ νƒν•˜λŠ” 것은 μž‘μ€ 일을 μˆ˜ν–‰ν•˜λŠ” 것과 λ°”κΏ€ 수 있기 λ•Œλ¬Έ.

TTκ°€ 그보닀 큰 κ²½μš°μ—λŠ” 였히렀 ν• λ‹Ήν•˜μ§€ μ•ŠλŠ” 것이 μœ λ¦¬ν•΄μ§€λŠ” κ²½μš°κ°€ μ‘΄μž¬ν•œλ‹€. 이λ₯Ό μ œμ–΄ν•˜κΈ° μœ„ν•΄ λ„μž…λœ 것이 Forbidden Regions 라고 보면 λœλ‹€.

  • Scenery λ¬Έμ œμ™€ 달리 논문에 λ‚˜μ˜¨ Forbidden RegionsλŠ” λ”±νžˆ μ •μˆ˜ κ΅¬κ°„μœΌλ‘œ μ œν•œλ˜μ§€ μ•Šμ•˜λ‹€...

Naiiiiveν•œ κ΅¬ν˜„

  1. μž„μ˜μ˜ (λͺ¨λ“ ) [ri,di][r_i, d_i]와 [rj,dj][r_j, d_j]λ₯Ό κ³ λ₯Έλ‹€. (단, ri<djr_i \lt d_j)
  2. κ³ λ₯Έ ꡬ간 [ri,dj][r_i, d_j] μ•ˆμ— μ†ν•˜λŠ” λͺ¨λ“  μž‘μ—…μ„ μ°Ύμ•„, μ•„λž˜λ₯Ό μˆ˜ν–‰ν•œλ‹€.
    1. djd_j λΆ€ν„°(λ’€μͺ½λΆ€ν„°) μŠ€μΌ€μ₯΄λ§μ„ μ‹œλ„ν•œλ‹€. 이 λ•Œ, 이미 ꡬ해진 Forbidden Regions이 μžˆλ‹€λ©΄ ν”Όν•΄κ°„λ‹€.
    2. μŠ€μΌ€μ₯΄λ§μ„ ν•œ κ²°κ³ΌλŠ” μ•„λž˜ 3가지 Caseκ°€ μžˆλ‹€.
      1. 할당을 μ‹œλ„ν•˜λ‹€κ°€ μ‹€νŒ¨. λͺ¨λ“  μΌ€μ΄μŠ€μ— λŒ€ν•΄μ„œ 적어도 ν•˜λ‚˜ 이상 할당이 μ•ˆλ˜λŠ” 것을 λ°œκ²¬ν•œ κ²ƒμ΄λ―€λ‘œ μ’…λ£Œν•œλ‹€.
      2. (μ€‘μš”) λ§ˆμ§€λ§‰μ— ν• λ‹Ήν•œ rlastr_{last}κ°€ rlast<T+rir_{last} \lt T + r_iλ₯Ό λ§Œμ‘±ν•˜λ©΄, (rlastβˆ’T,ri)(r_{last} - T, r_i) (κ°œκ΅¬κ°„)을 Forbidden Regions에 μΆ”κ°€ν•œλ‹€.
      3. rlastβ‰₯T+rir_{last} \ge T + r_i λ₯Ό λ§Œμ‘±ν•˜λŠ” κ²½μš°μ—λŠ” Forbidden Regions에 μΆ”κ°€ν•  ν•„μš”κ°€ μ—†λ‹€. (쉬지 μ•Šκ³  할당해도 λœλ‹€)

μœ„ 방법은 1번과 2번 κ³Όμ •λΆ€ν„° 이미 O(2N)O(2^N)κ°€ λ˜μ–΄ κΈ€λŸ¬λ¨Ήμ—ˆλ‹€(λͺ¨λ“  뢀뢄집합을 μ°Ύκ³  μžˆλŠ” κ²ƒμ΄λ―€λ‘œ). λ‹€ν–‰νžˆ, κ°œμ„ ν•  수 μžˆλ‹€.

Polynomial Algorithm

μš°μ„ , Forbidden Regions은 μ΅œλŒ€ O(N)O(N) 개의 ꡬ간을 가진닀. μ™œλƒλ©΄, μΆ”κ°€ν•œ κ΅¬κ°„μ˜ ν˜•νƒœλŠ” (rlastβˆ’T,ri)(r_{last} - T, r_i) μ˜€κΈ° λ•Œλ¬Έμ—, 끝점의 κ°œμˆ˜λŠ” O(N)O(N) 개둜 κ³ μ •λ˜κ³ , κ·Έλ“€ 쀑 μ΅œλŒ€ 길이λ₯Ό κ°€μ§€λŠ” 녀석은 1κ°œκ°€ λ˜λ―€λ‘œ 전체 ꡬ간 μˆ˜κ°€ O(N)O(N)이 λ˜λŠ” 것. 이 κΈ°λ³Έ 사싀을 λ°”νƒ•μœΌλ‘œ 연산을 μ•„λž˜μ™€ 같이 쀄일 수 μžˆλ‹€.

κ°„λ‹¨ν•œ 관찰을 ν•˜λ©΄, μ–΄λ–€ ꡬ간 [ri,βˆ—][r_i, *]을 μž‘μ•˜μ„ λ•Œ Forbidden RegionλŠ” 항상 κ·Έ κ΅¬κ°„μ˜ μ™Όμͺ½μ— ν˜•μ„±λœλ‹€. λ‹€μ‹œ λ§ν•˜μžλ©΄, μ„ νƒν•œ ꡬ간 [ri,βˆ—][r_i, *]둜 μƒμ„±λ˜λŠ” Forbidden Region은 ri<rjr_i \lt r_j인 κ΅¬κ°„λ§Œ λ§Œλ“€ 수 μžˆλ‹€λŠ” 것이닀. λ”°λΌμ„œ μœ„μ˜ Naiveν•œ κ΅¬ν˜„μ˜ 1λ²ˆμ—μ„œ μž„μ˜μ˜ ꡬ간을 μ„ νƒν•˜λŠ” 것이 μ•„λ‹ˆλΌ, λ’€μͺ½λΆ€ν„° μ„ νƒν•˜λ©΄μ„œ 보면 ν•œλ²ˆ μ²˜λ¦¬ν•œ 후보λ₯Ό λ‹€μ‹œ μ²˜λ¦¬ν•  ν•„μš”κ°€ 없어진닀. μ—¬κΈ°κΉŒμ§€ ν•˜λ©΄ ν•˜λ‚˜μ˜ ꡬ간을 μ²˜λ¦¬ν•˜λŠ”λ° O(N)O(N), λ§Žμ•„μ•Ό O(N2)O(N^2) 번 과정을 μˆ˜ν–‰ν•˜λ©΄ λ˜λ―€λ‘œ μ‹œκ°„λ³΅μž‘λ„λŠ” 이 λ‘˜μ„ κ³±ν•΄μ„œ O(N3)O(N^3) 이닀.

μ—¬κΈ°μ„œ, ꡬ간을 rir_iκ°€ μ¦κ°€ν•˜λŠ” 순으둜 미리 μ •λ ¬ν•˜λ©΄, 쀑볡 계산을 μ œκ±°ν•˜μ—¬ O(N2)O(N^2)으둜 λ§Œλ“€ 수 μžˆλ‹€. f(i,j)f(i, j)λ₯Ό [ri,dj][r_i, d_j] κ΅¬κ°„μ—μ„œμ˜ Forbidden Regions 생성 결과라고 ν•˜λ©΄, f(i+1,j)f(i + 1, j)λ₯Ό μ•Œλ©΄, 마치 Mo's μ•Œκ³ λ¦¬μ¦˜ 처럼 O(1)O(1) μ‹œκ°„λ§Œμ— μΆ”κ°€λ˜λŠ” 녀석을 κ³ λ €ν•œ μƒˆλ‘œμš΄ Forbidden Regionsλ₯Ό ꡬ할 수 있게 λœλ‹€.

Deep dive Algorithm

μ„œλ‘μ— μ†Œκ°œλœ λ…Όλ¬Έμ—μ„œ O(Nlog⁑N)O(N \log N) 으둜 쀄일 수 μžˆλŠ” 방법에 λŒ€ν•΄μ„œ μ†Œκ°œν•˜κ³  μžˆλ‹€. 아직 μ™„μ „νžˆ μ΄ν•΄ν•˜μ§€ λͺ»ν•΄μ„œ 적지 λͺ»ν•˜μ§€λ§Œ, λ…Όλ¬Έμ—μ„œ 핡심은 μ•„λž˜λΌκ³  ν•œλ‹€.

The key to obtaining a speed-up from O(N2)O(N^2) to O(Nlog⁑N)O(N \log N) involves a basic shift in the way we deal with critical times. Instead of keeping track of each cic_i individually, so that the current value of any cic_i can be found in constant time (the approach of Algorithm A), we shall keep track of a smaller amount of information, which will be sufficient for determining the current value of any cic_i in time O(log⁑n)O(\log n). This will permit us to use more efficient procedures for organizing and updating the data structures neded for computing the cic_i values.