Aşağıdaki Google Code Jam 1.C yuvarlak sorusunu düşünün :
Çin Seddi, tüm konumlardaki yüksekliğin olduğu sonsuz bir çizgi olarak başlar .
Bazı kabileler , , duvara aşağıdaki parametrelere göre saldırır - bir başlangıç günü, , bir başlangıç gücü , bir başlangıç batı koordinatı, ve bir başlangıç doğu koordinatı, . Bu ilk saldırı gününde , aralığında , kuvvetinde meydana gelir . içinde yüksekliğine sahip herhangi bir bölüm varsa , saldırı başarılı olur ve günün sonunda, duvar yüksekliği sonra yüksekte olur (veya daha büyük, o gün başka bir saldırı gücüyle aynı segmente )
Her kabile geri çekilmeden önce saldırıya kadar gerçekleştirecek ve her saldırı bir önceki saldırıdan itibaren tekrarlanarak belirlenecektir. Her kabilenin saldırı sırasını belirleyen , ve vardır: Saldırılar arasında gün bekleyecek , her saldırı için saldırı aralıklarını birimleri (negatif = batı, pozitif = doğu), ancak menzilin boyutu aynı kalacak ve güçleri de her saldırıdan sonra sabit bir değer artacak / azalacaktır.
Sorunun amacı, saldıran kabilelerin tam bir açıklaması verildiğinde, saldırılarının kaçının başarılı olacağını belirlemektir.
Yaklaşık 20 saniye içinde çalışan bir çözümü kodlamayı başardım: Uyguladığım çözümün zamanını aldığını düşünüyorum , burada toplam saldırı sayısı bir simülasyon (maks ) ve saldırı menzillerindeki benzersiz kenar noktalarının toplam sayısı (maks. 2000000 ).A = 1000000 X =
Yüksek seviyede benim çözümüm:
- Tüm Kabile bilgilerini okur
- Saldırı menzilleri için tüm benzersiz koordinatlarını hesaplar - O ( A )
- Duvarı, minimum yükseklik değerlerini izleyen aralıkları üzerinde tembel olarak güncellenen bir ikili ağaç olarak temsil eder . Bir yaprak, aralarında hiçbir şey olmayan iki X koordinatının açıklığıdır ve tüm ana düğümler, çocuklarının kapsadığı sürekli aralığı temsil eder. - O ( X log X )
- Her Kabilenin gerçekleştireceği tüm Saldırıları üretir ve güne göre sıralar -
- Her saldırı için, başarılı olup olmayacağına bakın ( sorgu süresi). Gün değiştiğinde, işlenmemiş tüm başarılı saldırılar arasında geçiş yapın ve duvarı buna göre güncelleyin ( her saldırı için X günlüğü güncelleme zamanı). - O ( A log X )
Sorum şu: dan daha iyi yapmanın bir yolu var mı ? Belki de, Kabilelerin ardışık saldırılarının doğrusal doğasından yararlanmanın stratejik bir yolu var mı? 20 saniye amaçlanan bir çözüm için çok uzun geliyor (Java bunun için suçlanıyor olsa da).