SamCoding Round 1 (Div. 3)


C. Sehrli juftliklar

Vaqt chegarasi: 1000 ms | Xotira chegarasi: 256 mb

Raqamlar Akademiyasining sirli xazinalar omborida \(n\) ta turli qiymatli afsungar sonlardan iborat \(a_1, a_2, \dots, a_n\) qatoriy massivi saqlanadi.

Akademiya ustozlari shunday qoida o'rnatishganki, massiv ichidan ikkita turli o'rindagi \(i\) va \(j\) (\(1 \le i < j \le n\)) elementlarini tanlaganda, ularning yig'indisi (\(a_i + a_j\)) juft son bo'lsa, bunday juftlik mukofotga loyiq "Sehrli juftlik" deb e'tirof etiladi

Sizning vazifangiz — ombordagi barcha mumkin bo'lgan elementlar orasidan jami nechta shunday "Sehrli juftlik" hosil qilish mumkinligini topishdan iborat.

Kirish ma'lumotlari

Birinchi qatorda yagona butun son \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — massivdagi elementlar soni kiritiladi.

Ikkinchi qatorda \(n\) ta butun son \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^9\)) — massiv elementlari beriladi.

Chiqish ma'lumotlari

Yagona qatorda — Akademiya talablariga mos keluvchi barcha "Sehrli juftliklar" sonini chop eting.

Misollar
# Input.txt Output.txt
1
5
2 4 6 3 5
4
2
4
1 2 3 4
2

Masala tahlili

Berilgan \(n\) ta elementdan iborat \(a_1, a_2, \dots, a_n\) massivdan shunday \((i, j)\) indekslar juftligini topish kerakki, bunda \(1 \le i < j \le n\) shart bajarilsin va ularning yig'indisi \((a_i + a_j)\) juft son bo'lsin. Jami shunday "Sehrli juftliklar" sonini topish talab etiladi.

Asosiy g'oya (Matematik yondashuv):

Ikkita sonning yig'indisi \((a_i + a_j)\) qachon juft son bo'ladi? Buni bilish uchun ularning juft yoki toqligini tekshirish kifoya:

  • Juft + Juft = Juft
  • Toq + Toq = Juft
  • Juft + Toq = Toq (bu bizga mos kelmaydi)

Demak, yig'indi juft chiqishi uchun tanlab olingan ikkita sonning ikkalasi ham juft bo'lishi yoki ikkalasi ham toq bo'lishi kerak.

Algoritm:

1. Massivdagi barcha sonlarni qarab chiqamiz va ularning nechtasi juft, nechtasi toq ekanini sanab olamiz:

  • Juft sonlar sonini saqlash uchun even_count o'zgaruvchisini ochamiz.
  • Toq sonlar sonini saqlash uchun odd_count o'zgaruvchisini ochamiz.

2. Juft sonlardan juftlik hosil qilish:
Agar massivda \(E\) ta juft son bo'lsa, ulardan ikkitasini tanlash usullari soni kombinatsealar formulasiga ko'ra \(E \times (E - 1) / 2\) ta bo'ladi.

3. Toq sonlardan juftlik hosil qilish:
Agar massivda \(O\) ta toq son bo'lsa, ulardan ikkitasini tanlash usullari soni \(O \times (O - 1) / 2\) ta bo'ladi.

4. Jami "Sehrli juftliklar" soni shu ikki qiymatning yig'indisiga teng:

\(\frac{E \times (E - 1)}{2} + \frac{O \times (O - 1)}{2}\)

Murakkablik:

Vaqt murakkabligi: \(O(n)\) — massivni bir marta to'liq ko'rib chiqib, juft va toq sonlar sanog'i topiladi. Bu \(n \le 2 \times10^5\) cheklovi uchun juda tez ishlaydi va vaqt chegarasiga bemalol ulguradi.
Xotira murakkabligi: \(O(1)\) yoki \(O(n)\) — massivni xotirada saqlash uchun (agar elementlarni birma-bir o'qib ketilsa, qo'shimcha massiv ham talab etilmaydi).

D. Kristallar va portal siri

Vaqt chegarasi: 1000 ms | Xotira chegarasi: 256 mb

Qadimiy minorada \(n\) ta sehrli kristall topilgan, ularning har birida \(a_i\) miqdorda energiya bor. Afsonaga ko'ra, agar ikkita kristallni birlashtirilsa va ularning energiyalari yig'indisi maxfiy son \(k\) ga qoldiqsiz bo'linsa, o'sha juftlik yashirin portalni ochadi.

Sehrgar sizdan yordam so'rayapti: minoradagi barcha kristall juftliklari orasida nechtasi portal ochish qobiliyatiga ega ekanini aniqlab bering — chunki minora qulab tushishidan oldin faqat bitta imkoniyat qoladi, va sehrgar qaysi juftlikni tanlashni oldindan bilmoqchi.

Kirish ma'lumotlari

Birinchi qatorda ikkita butun son \(n\) va \(k\) beriladi (\(1 \le n \le 2 \times 10^5\); \(1 \le k \le 10^9\)) — kristallar soni va portal sirli soni.

Ikkinchi qatorda \(n\) ta butun son \(a_1, \dots, a_n\) beriladi (\(0 \le a_i \le 10^9\)) — har bir kristallning energiyasi.

Chiqish ma'lumotlari

Portal ochishga qodir bo'lgan \((i, j)\) juftliklar sonini chop eting, bunda \(1 \le i < j \le n\) va \((a_i + a_j) \pmod k = 0\).

Misollar
# Input.txt Output.txt
1
4 3
3 1 5 2
2
2
5 5
5 10 15 20 25
10
3
6 4
1 3 2 2 5 7
5
Izoh

1-Test: \(n=4\), \(k=3\), kristallar: \(3, 1, 5, 2\)

Barcha juftliklarni tekshiramiz:

  • \(3 + 1 = 4\)\(4 \pmod 3 = 1\) — mos emas
  • \(3 + 5 = 8\)\(8 \pmod 3 = 2\) — mos emas
  • \(3 + 2 = 5\), \(5 \pmod 3 = 2\) — mos emas
  • \(1 + 5 = 6\), \(6 \pmod 3 = 0\)portal ochiladi \(\checkmark\)
  • \(1 + 2 = 3\), \(3 \pmod 3 = 0\)portal ochiladi \(\checkmark\)
  • \(5 + 2 = 7\), \(7 \pmod 3 = 1\) — mos emas

Jami \(2\) ta juftlik portal ochadi: \((1, 5)\) va \((1, 2)\).

2-Test: \(n=5\), \(k=5\), kristallar: \(5, 10, 15, 20, 25\)

Har bir son \(5\) ga qoldiqsiz bo'linadi (qoldig'i \(0\)), shuning uchun istalgan ikkita kristall birlashsa ham yig'indi \(5\) ga bo'linadi. Jami juftliklar soni \(\binom{5}{2} = \frac{5 \times 4}{2} = 10\).

3-Test: \(n=6\), \(k=4\), kristallar: \(1, 3, 2, 2, 5, 7\).

Har bir kristallni \(4\) ga bo'lgandagi qoldig'iga qarab guruhlaymiz:

  • qoldiq \(1\): kristallar \(\{1, 5\}\)
  • qoldiq \(3\): kristallar \(\{3, 7\}\)
  • qoldiq \(2\): kristallar \(\{2, 2\}\)

Qoldig'i \(2\) bo'lgan guruh o'zi ichida (\(2 + 2 = 4\), \(4 \pmod 4 = 0\)) — \(1\) ta juftlik: \((2, 2)\). Qoldiq \(1\) va qoldiq \(3\) guruhlari o'zaro birlashadi (yig'indi \(4\) karrali bo'ladi): \(1 + 3 = 4\), \(1 + 7 = 8\), \(5 + 3 = 8\), \(5 + 7 = 12\)\(4\) ta juftlik.

Jami: \(1 + 4 = 5\) ta juftlik portal ochadi.


Masala tahlili

Bizga \(n\) ta kristallar energiyalari berilgan: \(a_1, a_2, \dots, a_n\), va yana maxfiy son \(k\). Shunday \((i, j)\) indekslar juftligini \((1 \le i < j \le n)\) topishimiz kerakki, ularning yig'indisi \(k\) ga qoldiqsiz bo'linsin, ya'ni \((a_i + a_j) \pmod k == 0\). Jami shunday juftliklar sonini chiqarish talab etiladi.

Asosiy g'oya (Matematik yondashuv / Modular Aritmetika):

Ikkita \(a_i\) va \(a_j\) sonlarining yig'indisi \(k\) ga bo'linishi uchun ularning \(k\) ga bo'lgandagi qoldiqlari yig'indisi \(k\) ga bo'linishi kerak. Boshqacha qilib aytganda:

\((a_i + a_j) \pmod k \equiv 0\) \( \iff\) \((a_i \pmod k + a_j \pmod k)\) \(\pmod k \equiv 0\)

Bu shartdan kelib chiqib ikki xil holatni ko'rishimiz mumkin:

  1. Agar \(a_i \pmod k == 0\) bo'lsa, unga mos keluvchi ikkinchi sonning qoldig'i ham \(0\) bo'lishi kerak \((0 + 0 \equiv 0 \pmod k)\).
  2. Agar \(a_i \pmod k == r\) bo'lsa \((r > 0)\), unga mos keluvchi ikkinchi sonning qoldig'i \(k - r\) bo'lishi kerak, shunda ularning yig'indisi \(r + (k - r) = k\) bo'lib, \(k\) ga qoldiqsiz bo'linadi.

Algoritm (Chastota massivi yoki Hash Map yordamida):

  1. Massivdagi har bir elementni qarab chiqamiz va ularning \(k\) ga bo'lgandagi qoldig'ini topamiz: \(r = a_i \pmod k\).
  2. Har bitta qoldiq necha marta uchraganini hisoblab borish uchun chastota massividan (map yoki massiv) foydalanamiz.
  3. Hozirgi \(a_i\) elementi uchun, undan oldin kelgan va bizga mos keladigan qoldiqga ega elementlar sonini umumiy javobga qo'shamiz:
    — Agar \(r == 0\) bo'lsa, oldindan uchragan qoldig'i \(0\) bo'lgan elementlar sonini qo'shamiz.
    — Agar \(r > 0\) bo'lsa, oldindan uchragan qoldig'i \(k - r\) bo'lgan elementlar sonini qo'shamiz.
  4. Oxirida barcha mos juftliklar yig'indisini chiqaramiz.

Murakkablik:

Vaqt murakkabligi: \(O(n)\) — massivni bir marta to'liq qarab chiqish va qoldiqlarni hisoblash kifoya. \(n \le 2 \cdot 10^5\) cheklovi uchun juda tez ishlaydi.
Xotira murakkabligi: \(O(k)\) yoki \(O(n)\) — qoldiqlar chastotasini saqlash uchun.

E. Devorbuzar

Vaqt chegarasi: 1000 ms | Xotira chegarasi: 256 mb

Sizga o'lchami \(n \times m\) bo'lgan to'g'ri burchakli labirint berilgan. Labirint \(n\) ta qatordan iborat bo'lib, har bir qator \(m\) ta belgidan tashkil topgan. Har bir katak ikkita holatdan biriga ega:

  • \(\text{«.»}\) — bo'sh katak (yurish mumkin);
  • \(\text{«#»}\) — devor (odatda yurib bo'lmaydi).

Qatorlar \(1\) dan \(n\) gacha (yuqoridan pastga), ustunlar esa \(1\) dan \(m\) gacha (chapdan o'ngga) raqamlangan. \((r, c)\) katak \(r-\)qator va \(c-\)ustunda joylashgan katakni bildiradi.

Siz \((1, 1)\) katakdan sayohatni boshlaysiz va \((n, m)\) katakka yetib borishingiz kerak. Bir qadamda joriy katakdan unga chegaradosh (yuqori, quyi, chap yoki o'ng) katakka o'tishingiz mumkin.

Sizda maxsus kuch bor: sayohat davomida jami ko'pi bilan \(k\) ta devor katagini "buzib", oddiy bo'sh katakka aylantirib, undan o'tishingiz mumkin. Devorni buzib o'tish ham bitta oddiy qadam kabi hisoblanadi (ya'ni devor bo'lgan katakka o'tish ham 1 ta qadam sifatida hisoblanadi, lekin bunday o'tishlar soni \(k\) tadan oshmasligi kerak).

\((1, 1)\) va \((n, m)\) katakchalari har doim bo'sh \(\text{«.»}\) bo'lishi kafolatlanadi.

\((1, 1)\) dan \((n, m)\) gacha yetib borish uchun kerak bo'ladigan eng kam qadamlar sonini toping. Agar hech qanday holatda (ko'pi bilan \(k\) ta devor buzib ham) yetib bo'lmasa, \(-1\) chiqaring.

Kirish ma'lumotlari

Birinchi qatorda uchta butun son \(n\), \(m\) va \(k\) (\(2 \le n, m \le 300\); \(0 \le k \le \min(n \cdot m,\ 20)\)) — labirintning o'lchamlari va buzish mumkin bo'lgan devorlar sonining chegarasi berilgan.

Keyingi \(n\) ta qatorning har birida \(m\) ta belgidan iborat qator berilgan — labirintning tasviri (\(\text{«.»}\) yoki \(\text{«#»}\)).

Chiqish ma'lumotlari

Yagona butun sonni — \((1,1)\) dan \((n,m)\) gacha yetib borish uchun kerak bo'ladigan eng kam qadamlar sonini (yoki bu imkonsiz bo'lsa \(-1\)) chiqaring.

Misollar
# Input.txt Output.txt
1
3 5 1
.....
#####
.....
6
2
5 5 0
.....
.....
.....
....#
...#.
-1
3
5 5 1
.....
.....
.....
....#
...#.
8
Izoh

1-Test: O'rtadagi qator to'liq devordan iborat, shuning uchun kamida bitta devorni buzish kerak. Masalan, \((1,1) \to (2,1)\) (devor buzib) \(\to (3,1) \to (3,2)\) \(\to (3,3) \to (3,4) \to (3,5)\) — jami \(6\) ta qadam.

2-Test: \(k=0\) bo'lgani uchun devor buzish mumkin emas, \((5,5)\) katakning ikkala qo'shnisi ham devor bo'lgani sabab uni umuman bosib bo'lmaydi.

3-Test: Endi bitta devor buzish mumkin. \((5,5)\) katakka \((4,3)\) yoki \((3,5)\) orqali kirib, faqat bitta devorni buzish kifoya qiladi — javob Manhetten masofasiga (\(4+4=8\)) teng bo'lib qoladi.


Masala tahlili

Bizga \(n \times m\) o'lchamli labirint berilgan. Boshlang'ich nuqta \((1, 1)\), oxirgi manzil esa \((n, m)\). Labirintda bo'sh kataklar ('.') va devorlar ('#') mavjud. Biz eng ko'pi bilan \(k\) ta devorni "buzib", oddiy bo'sh katakka aylantirgan holda \((1, 1)\) dan \((n, m)\) ga borish uchun ketadigan eng kam qadamlar sonini topishimiz kerak. Agar ilojsiz bo'lsa, \(-1\) chiqaramiz.

Asosiy g'oya (Shortest Path / BFS):

Bu turdagi eng qisqa yo'lni topish masalalarida BFS (Breadth-First Search - Eniga qidirish) algoritmidan foydalanamiz. Biroq, bu oddiy BFS emas, chunki bizda qo'shimcha resurs (\(k\) ta devor buzish imkoniyati) mavjud.

Holatni (state) quyidagicha belgilaymiz: \((r, c, \text{broken})\), bu yerda:

  • \(r\) — hozirgi qator indeksi;
  • \(c\) — hozirgi ustun indeksi;
  • \(\text{broken}\) — shu paytgacha nechta devor buzib o'tilgani.

Cheklovlar kichik bo'lgani uchun (\(2 \le n, m \le 300\) va \(0 \le k \le \min(n \cdot m, 20)\)), holatlar soni unchalik katta emas.

Algoritm (0-1 BFS yoki Oddiy BFS + Visited massivi):

1. Navbat (Queue): BFS navbatiga boshlang'ich holatni qo'shamiz: \((1, 1, 0)\) — ya'ni \((1, 1)\) katakdamiz va hali \(0\) ta devor buzganmiz, qadamlar soni \(0\) ga teng.

2. Masofalar/Holatlar massivi (\(dist[r][c][broken]\)): Har bir katak uchun shu paytgacha sarflangan eng kam qadamlarni saqlab boramiz. Boshlang'ich qiymatlar cheksizlik (\(\infty\)) bilan to'ldiriladi.

3. Qadam tashlash:

  • Hozirgi \((r, c)\) katakdan to'rtta qo'shni tomonga (yuqori, pastki, chap, o'ng) yuramiz.
  • Agar qo'shni katak bo'sh ('.') bo'lsa, devor buzish soni o'zgarmaydi (\(\text{broken}\) o'zgarmaydi).
  • Agar qo'shni katak devor ('#') bo'lsa, uni buzib o'tishimiz mumkin, bunda \(\text{broken} + 1\) ga teng bo'ladi (agar bu qiymat \(k\) dan oshib ketmasa).

4. Optimallashtirish: Har safar yangi holatga o'tganda qadamlar soni kamroq bo'lsagina uni navbatga qo'shamiz va dist massivini yangilaymiz.

5. \((n, m)\) katakiga yetib kelganimizdagi eng birinchi topilgan qadamlar soni eng qisqa yo'l bo'ladi (chunki BFS qadamma-qadam kengayib boradi). Agar oxirigacha borib bo'lmasa, \(-1\) chiqaramiz.

Murakkablik:

Vaqt murakkabligi: \(O(n \times m \times k)\) — har bir katak va har bir mumkin bo'lgan buzilgan devorlar soni holati uchun navbatdan bir marta o'tiladi. \(300 \times 300 \times 20 \approx 1.8 \times 10^6\) operatsiyani tashkil qiladi va vaqt chegarasiga bemalol ulguradi.
Xotira murakkabligi: \(O(n \times m \times k)\) — dist massivi va navbat uchun sarflanadigan xotira.

F. Alkimyogar yordamchilari

Vaqt chegarasi: 1000 ms | Xotira chegarasi: 256 mb

Minora qulashidan oldin, alkimyogar qatorda tizilgan \(n\) ta kristallni (\(a_1, a_2, \dots, a_n\) tartibida, energiyalari mos ravishda) \(m\) ta yordamchisiga taqsimlab berishi kerak. Har bir yordamchi kristallarning ketma-ket (tartibni buzmasdan) bo'lagini oladi — ya'ni massiv aynan \(m\) ta bo'sh bo'lmagan qismga bo'linadi.

Alkimyogar adolatli bo'lishni xohlaydi: eng ko'p energiya olgan yordamchining yukini iloji boricha kamroq qilishni istaydi. Eng kichik mumkin bo'lgan maksimal yukni toping.

Kirish ma'lumotlari

Birinchi qatorda ikkita butun son \(n\) va \(m\) beriladi (\(1 \le m \le n \le 2 \times 10^5\)).

Ikkinchi qatorda \(n\) ta butun son \(a_1, \dots, a_n\) beriladi (\(1 \le a_i \le 10^9\)) — kristallarning energiyalari.

Chiqish ma'lumotlari

Eng kichik mumkin bo'lgan maksimal yukni chop eting.

Misollar
# Input.txt Output.txt
1
5 2
7 2 5 10 8
18
2
5 3
7 2 5 10 8
14
3
7 4
4 8 9 2 3 6 5
12
Izoh

1-Test: \(n=5\), \(m=2\), kristallar: \(7, 2, 5, 10, 8\)
Massivni \(2\) ta ketma-ket bo'lakka bo'lamiz: \([7, 2, 5]\) (yig'indi = \(14\)) va \([10, 8]\) (yig'indi = \(18\)). Ikki bo'lakning maksatli maximumi = \(18\). Boshqa har qanday bo'linish bundan kattaroq yuk beradi, shuning uchun eng kichik maksimal yuk = \(18\).

2-Test: \(n=5\), \(m=3\), xuddi shu kristallar
Endi \(3\) ta bo'lakka bo'lamiz: \([7, 2, 5]\) (\(14\)), \([10]\) (\(10\)), \([8]\) (\(8\)). Maksimal yuk = \(14\). Bo'laklar soni oshgani sari yukni tekislash osonlashadi, shuning uchun javob kamaydi (\(18 \rightarrow 14\)).

3-Test: \(n=7\), \(m=4\), kristallar: \(4, 8, 9, 2, 3, 6, 5\)
Optimal bo'linish maksimal yukni \(12\) ga tushiradi. Undan kichik limit bilan bo'lib bo'lmaydi, chunki \(9\) o'zi katta element bo'lib, kamida bitta guruh yukini \(12\) ga yetkazadi.


Masala tahlili

Bu masalada berilgan massivni tartibini buzmagan holda \(m\) ta ketma-ket bo'lakka bo'lishimiz va har bir bo'lak yig'indilarining eng kattasini (maksimal qismini) imkon qadar kichik qilishimiz talab etiladi.

Asosiy g'oya (Binary Search on Answer):

Massiv elementlari va o'lchami katta bo'lgani uchun (\(\le 2 \times 10^5\)), to'g'ridan-to'g'ri qidirib chiqish vaqt chegarasiga ulgurmaydi. Shuning uchun javobning o'zini ikkilik qidiruv orqali topamiz.

1. Qidiruv chegaralari (low va high):

  • Javob eng kamida massivdagi eng katta elementga teng bo'lishi shart (\(low = max(a)\)), chunki bitta elementning o'zi boshqalardan katta bo'lsa ham guruh yig'indisini o'sha qiymatdan kamaytirib bo'lmaydi.
  • Eng ko'pi bilan barcha elementlar yig'indisiga teng bo'lishi mumkin (\(high = sum(a)\)).

2. Ochko'zlik (Greedy) yondashuvi:

Ikkilik qidiruv orqali o'rtadagi qiymatni (\(mid\)) eng katta ruxsat etilgan limit deb olamiz. Keyin massivni chapdan o'ngga qarab yig'ib chiqamiz:

  • Agar joriy elementni qo'shganda limitdan oshib ketsa, demak yangi yordamchiga o'tamiz (bo'laklar sonini \(1\) taga oshiramiz).
  • Agar oxirida hosil bo'lgan bo'laklar soni \(m\) tadan oshib ketmasa, demak bu limitimiz to'g'ri keladi va javobni kichikroq tomonga qarab qidirib ko'ramiz (\(high = mid - 1\)). Aks holda limitni kattalashtiramiz (\(low = mid + 1\)).

Murakkablik

Ikkilik qidiruv taxminan \(O(\log(\text{sum}(a)))\) marta takrorlanadi.
Har bir tekshirish (greedy o'tish) \(O(n)\) vaqt oladi.
Umumiy murakkablik: \(O(n \times \log(\text{sum}(a)))\).