Pertimbangkan pertanyaan 1C putaran Google Code Jam berikut :
Tembok Besar Tiongkok dimulai sebagai garis tanpa batas, di mana ketinggian di semua lokasi adalah .
Sejumlah suku , , akan menyerang dinding sesuai dengan parameter berikut - hari awal, , mulai kekuatan , mulai koordinat barat, , dan mulai koordinat timur, . Serangan pertama ini terjadi pada hari , pada kisaran , dengan kekuatan . Jika ada bagian dari Tembok Besar dalam yang memiliki ketinggian , serangan itu berhasil, dan pada akhir hari, dinding akan dibangun sehingga setiap segmen itu dalam tinggi maka akan menjadi tinggi (atau lebih besar, jika beberapa serangan lain hari itu mengenai segmen yang sama dengan kekuatan )
Setiap suku akan melakukan hingga serangan sebelum mundur, dan setiap serangan akan ditentukan secara iteratif dari yang sebelumnya. Setiap suku memiliki beberapa , , dan yang menentukan urutan serangan mereka: Mereka akan menunggu hari antara serangan, mereka akan memindahkan unit serangan unit untuk setiap serangan (negatif = barat, positif = timur), meskipun ukuran kisaran akan tetap sama, dan kekuatan mereka juga akan meningkat / berkurang dengan nilai konstan setelah setiap serangan.
Tujuan dari masalah ini adalah, mengingat deskripsi lengkap dari suku-suku yang menyerang, menentukan berapa banyak dari serangan mereka akan berhasil.
Saya berhasil membuat kode solusi yang berfungsi, berjalan dalam sekitar 20 detik: Saya percaya solusi yang saya implementasikan membutuhkan waktu , di mana jumlah total serangan di simulasi (maks. 1000000 ), dan X = jumlah total titik tepi unik pada rentang serangan (maks. 2000000 ).A =
Pada tingkat tinggi, solusi saya:
- Membaca semua informasi Suku
- Menghitung semua koordinat unik untuk rentang serangan - O ( A )
- Merupakan Wall sebagai pohon biner yang diperbarui secara malas pada rentang yang melacak nilai ketinggian minimum. Daun adalah rentang dua koordinat X dengan tidak ada di antaranya, dan semua simpul orangtua mewakili interval kontinu yang dicakup oleh anak-anak mereka. - O ( X log X )
- Hasilkan semua Serangan yang akan dilakukan oleh setiap Suku, dan urutkan berdasarkan hari -
- Untuk setiap serangan, lihat apakah itu akan berhasil ( waktu permintaan). Ketika hari berubah, ulangi semua serangan sukses yang belum diproses dan perbarui tembok yang sesuai ( log waktu pembaruan X untuk setiap serangan). - O ( A log X )
Pertanyaan saya adalah ini: Apakah ada cara untuk berbuat lebih baik daripada ? Mungkin, adakah cara strategis untuk mengambil keuntungan dari sifat linear dari serangan berturut-turut Suku? 20 detik terasa terlalu lama untuk solusi yang dimaksudkan (meskipun Jawa mungkin yang harus disalahkan untuk itu).