# Proposal Ide Soal ## Pradita Dirgantara Competition ### Memindahkan kardus **Deskripsi** Diberikan sebuah grid berukuran $R \times C$. Setiap petak pada grid bisa merupakan salah satu dari beberapa tipe berikut : - `S` : titik start - `F` : titik finish - `.` : petak kosong - `#` : dinding Pada titik start terdapat sebuah gudang. Di dalam gudang tersebut terdapat $N$ buah kardus berbentuk persegi panjang. Kardus ke $i$ berukuran $h_i \times w_i$ Kamu ingin memindahkan kardus-kardus dari titik start dengan ketentuan sebagai berikut : - Pilih sebuah kardus yang masih ada di gudang dan keluarkan dari gudang. Anggap gudang berada pada koordinat $(r, c)$, maka ketika kardus $i$ dikeluarkan dari gudang, semua petak dari baris $[r, r+h_i-1]$ dan kolom $[c, c+w_i-1]$ harus kosong (tidak boleh ada petak `#`) - Ulangi proses berikut : Geser kardus ke kiri/kanan/atas/bawah apabila pergeseran tersebut tidak terhalang oleh dinding (petak `#`). - Apabila sudah ada bagian dari kardus tersebut yang mencapai titik finish, maka pergerakannya selesai **Catatan : Kardus tidak bisa dirotasi** Berikut ilustrasi pemindahan kardus berukuran $2 \times 3$ : ![Screenshot 2024-10-03 at 20.15.17](https://hackmd.io/_uploads/HybeFM3CA.png) Kardus berukuran $3 \times 2$ tidak bisa dikeluarkan dari gudang karena terhalang dinding ![Screenshot 2024-10-03 at 20.16.00](https://hackmd.io/_uploads/rJnMFM2CA.png =x320) Kardus berukuran $1 \times 4$ bisa dikeluarkan dari gudang. Namun tidak ada pergerakan yang memungkinkan bagi kardus tersebut untuk bisa sampai ke titik finish (`F`) karena terhalang dinding di tengah perjalanan ![Screenshot 2024-10-03 at 20.18.12](https://hackmd.io/_uploads/HkgotG3A0.png) **Objective** Tentukan banyak kardus maksimal yang bisa sampai di titik Finish **Batasan** - $1 ≤ N ≤ 5 \times 10^4$ - $1 ≤ h_i, w_i ≤ 5 \times 10^4$ - $1 ≤ R \times C ≤ 5 \times 10^4$ **Solusi** Apabila suatu kardus berukuran $h \times w_1$ bisa mencapai finish, maka kardus berukuran $h \times w_2$ bisa mencapai finish juga apabila $w_2 ≤ w_1$ Maka dari itu, untuk suatu tinggi kardus $h$, kita bisa mencatat ada berapa banyak kardus lebar $w$ secara terurut menaik ($w_1 ≤ w_2 ≤ \ldots ≤ w_k$) kemudian kita bisa melakukan **binary search** untuk mencari nilai $w$ terbesar pada ukuran $h$ ini Kasus terburuk terjadi ketika terdapat $\sqrt{N}$ buah kardus yang memiliki $h$ berbeda dan setiap ukuran $h$ memiliki $\sqrt{N}$ buah kardus berukuran $w$ berbeda-beda kira kira seperti ini : $h_1$ terdapat lebar $w_{1,1} ≤ w_{1,2} ≤ \ldots ≤ w_{1,\sqrt{N}}$ $h_2$ terdapat lebar $w_{2,1} ≤ w_{2,2} ≤ \ldots ≤ w_{2,\sqrt{N}}$ $\vdots$ $h_{\sqrt{N}}$ terdapat lebar $w_{\sqrt{N},1} ≤ w_{\sqrt{N},2} ≤ \ldots ≤ w_{\sqrt{N},\sqrt{N}}$ Untuk memeriksa apakah suatu kardus berukuran $h \times w$ bisa mencapai tiitk finish, kita bisa menggunakan BFS dengan kompleksitas $O(R \times C)$ dimana di setiap transisinya untuk memeriksa apakah gerakannya valid, kita bisa menggunakan 2D prefix sum untuk memeriksa apakah ada petak berisi dinding Kompleksitas waktu untuk algoritma ini adalah : $O(\sqrt{N} \times \text{log}_2\sqrt{N} \times R \times C)$ dalam kasus terburuk estimasi prosesnya adalah $\sqrt{5 \times 10^4} \times \text{log}_2\sqrt{5 \times 10^4} \times 5 \times 10^4$ $= 223 \times 8 \times 5 \times 10^4$ $= 89,200,000$ **Tags** - Binary Search - Brute Force - Optimization / Pruning - BFS - 2D Prefix Sum