Çiftlik dışındaki uzun vadeli kariyer fırsatlarını göz önünde bulundurarak, inek Bessie çeşitli çevrimiçi kodlama sitelerinde algoritmalar öğrenmeye başladı. En sevdiği iki algoritma "kabarcık sıralaması (bubble sort)" ve "hızlı sıralama (quicksort)", ama ne yazık ki Bessie bu ikisini kolayca karıştırıyor ve sonunda ikisinin oldukça tuhaf bir melezini uyguluyor!
dizisinin ve i + 1 elemanları arasındaki konuma, eğer A_0, \ldots, A_i'nin maksimumu A_{i+1}, \ldots, A_{n-1}'in minimumundan büyük değilse, bir bölüm noktası (partition point) diyelim. Bessie, hızlı sıralamanın diziyi bir bölüm noktasına sahip olacak şekilde yeniden düzenlediğini ve ardından iki parçayı A_0, \ldots, A_i ve A_{i+1}, \ldots, A_{n-1} olarak özyinelemeli şekilde sıraladığını hatırlıyor. Ancak, bir dizinin tüm bölüm noktalarının doğrusal zamanda bulunabileceğini doğru bir şekilde not etmesine rağmen, hızlı bir şekilde bir bölüm noktası oluşturmak için dizinin nasıl yeniden düzenlenmesi gerektiğini unutmuş! Sıralama tarihindeki en kötü algoritmik hata olabilecek şekilde, bu işlem için kabarcık sıralamasını kullanma gibi talihsiz bir karar veriyor.
İşte Bessie'nin dizisini sıralamak için uyguladığı kodun taslağı. İlk olarak, kabarcık sıralamasının bir geçişini gerçekleştiren basit bir fonksiyon yazıyor:
bubble_sort_pass (A) {
for i = 0 to length(A)-2
if A[i] > A[i+1], swap A[i] and A[i+1]
}Hızlı(ımsı) sıralama fonksiyonunun özyinelemeli kodu şu şekilde yapılandırılmıştır:
quickish_sort (A) {
if length(A) = 1, return
do { // Main loop
work_counter = work_counter + length(A)
bubble_sort_pass(A)
} while (no partition points exist in A)
divide A at all partition points; recursively quickish_sort each piece
}Bessie, kodunun ne kadar hızlı çalışacağını merak ediyor. Basitlik adına, ana döngünün her bir yinelemesinin doğrusal zaman aldığını varsayıyor, bu yüzden algoritmanın yaptığı toplam işi takip etmek için döngü içinde work\_counter global değişkenini buna göre artırıyor.
Verilen giriş dizisi için, dizi quickish\_sort tarafından sıralandıktan sonra work\_counter'ın son değerini tahmin edin.
İlk satır bir tamsayı n~(1 \le n \le 10^5) içerir. Sonraki satırın her biri dizinin bir elemanını içerir: A_0, \ldots, A_{n-1} — ile 10^9 arasında bir tamsayı. Elemanlar mutlaka farklı olmak zorunda değildir.
Tek bir tamsayı yazdırın — work\_counter'ın son değeri.
Örnek 1
Bu örnekte, 20\ 2\ 3\ 4\ 9\ 8\ 7 dizisiyle başlıyoruz. Kabarcık sıralamasının bir geçişinden sonra (ki bu work\_counter'a ekler), 2 \mid 3 \mid 4 \mid 9\ 8\ 7 \mid 20 elde ederiz; burada bir bölüm noktasını belirtir. Bu nedenle, problem özyinelemeli alt problemlere bölünür: , , ve 'yi sıralamak (her biri sıfır iş gerektirir) ve 'yi sıralamak. alt problemi için, ana döngünün bir yinelemesi ( birim iş) 8\ 7 \mid 9 verir, ardından üzerinde son bir geçiş ( birim iş) sıralamayı tamamlar. Toplamda, work\_counter 7 + 3 + 2 = 12'ye eşittir.