Asosiy qismga o‘tish

5. Ikki ko‘rsatkich va sirpanuvchi oyna

Nazariya

Fikr

Ichma-ich ikkita sikl O(n²) beradi. Ko‘p masalada esa ikkinchi indeks
orqaga qaytmaydi — u faqat oldinga siljiydi. Shunda ikkala indeks
ham jami n martadan ko‘p siljimaydi va murakkablik O(n) bo‘ladi.

Saralangan massivda juftlik

Yig‘indisi S ga teng juftlikni topamiz:

chap, ong = 0, len(a) - 1
while chap < ong:
    s = a[chap] + a[ong]
    if s == S:
        print(a[chap], a[ong]); break
    if s < S:
        chap += 1        # yig‘indi kichik — kattaroq son kerak
    else:
        ong -= 1         # yig‘indi katta — kichikroq son kerak

Sirpanuvchi oyna

Oyna — massivning uzluksiz bo‘lagi. O‘ng chegara oldinga siljiydi,
shart buzilsa chap chegara ham siljiydi:

# yig‘indisi K dan oshmaydigan eng uzun bo‘lak
chap = 0
joriy = 0
javob = 0
for ong in range(n):
    joriy += a[ong]
    while joriy > K:
        joriy -= a[chap]
        chap += 1
    javob = max(javob, ong - chap + 1)

Har bir element oynaga bir marta kiradi va bir marta chiqadi — demak
O(n).

Qachon ishlaydi

  • massiv saralangan yoki tartib muhim bo‘lganda;
  • oyna kengaysa shart faqat «yomonlashsa» (monotonlik);
  • uzluksiz bo‘lak (subarray) haqida so‘ralganda.

Manfiy sonlar bo‘lsa, «yig‘indi bo‘yicha oyna» buziladi — u yerda
prefiks yig‘indi yoki boshqa usul kerak.

Misol

n, K = map(int, input().split())
a = list(map(int, input().split()))
chap = joriy = javob = 0
for ong in range(n):
    joriy += a[ong]
    while joriy > K:
        joriy -= a[chap]
        chap += 1
    javob = max(javob, ong - chap + 1)
print(javob)

Mashq masalalari

✓KodMasalaQiyinlik
AL05-1 Yig‘indisi x ga teng juftliklar Boshlang‘ich
AL05-2 Eng yaxshi hafta Boshlang‘ich
AL05-3 Byudjet O‘rta
AL05-4 Takrorsiz bo‘lak O‘rta
AL05-5 Ikki ro‘yxatni birlashtirish Boshlang‘ich

Nazorat savollari

1 Ikki ko‘rsatkich usuli nima uchun O(n) beradi? Bitta to‘g‘ri javob
2 Saralangan massivda yig‘indi kerakli `S` dan kichik chiqsa nima qilinadi? Bitta to‘g‘ri javob
3 Sirpanuvchi oyna usuli uzluksiz bo‘lak (subarray) haqidagi masalalarda ishlatiladi. To‘g‘ri yoki noto‘g‘ri
4 Oynaning uzunligi qanday hisoblanadi? Bo‘sh joyni to‘ldirish
uzunlik = ong - chap + ____
5 Sirpanuvchi oyna qachon to‘g‘ri ishlaydi? Bir nechta to‘g‘ri javob

Bir nechta javob to‘g‘ri bo‘lishi mumkin.

6 a = [1, 2, 3], K = 3. Yig‘indisi K dan oshmaydigan eng uzun bo‘lak uzunligi nechchi? Kod nima chiqaradi
# 1+2 = 3 <= 3, uzunlik 2
# 2+3 = 5 > 3
7 Ichma-ich ikkita sikl bilan barcha bo‘laklarni ko‘rish murakkabligi qanday? Bitta to‘g‘ri javob
8 Sirpanuvchi oynada har bir element oynaga necha marta kiradi va chiqadi? Qisqa javob — yoziladi
9 Massivda manfiy sonlar bo‘lsa, yig‘indi bo‘yicha sirpanuvchi oyna usuli baribir ishlayveradi. To‘g‘ri yoki noto‘g‘ri
10 Ikki ko‘rsatkich usulidan oldin ko‘pincha nima qilinadi? Bitta to‘g‘ri javob

Javoblar serverda tekshiriladi. Katta-kichik harf, apostrof shakli va ortiqcha bo‘shliq ahamiyatsiz.