Zadanie

Kubo je veľký milovník štipľavých jedál. Na poličke v kuchyni má \(N\) koreničiek zoradených od najmenej po najviac štipľavú. Každá korenička je označená číslom od \(1\) po \(N\).
Raz však vyskúšal známu kalifornskú papričku a keď so slzami v očiach odkladal koreničky naspäť, všetky ich poprehadzoval.

Keď sa neskôr spamätal a rozhodol sa ich znova upratať, zistil, že nemá dosť síl na veľké presuny. Dokáže vždy vymeniť len dve susedné koreničky – teda tie, ktoré stoja na pozíciách \(A\) a \(A + 1\).

Úloha

Vašou úlohou je zistiť, na koľko najmenej susedných výmen vie Kubo dosiahnuť,
aby sa K najmenej štipľavých koreničiek (čísel \(1\)\(K\)) nachádzalo na prvých \(K\) pozíciách,
v ľubovoľnom poradí.

Formát vstupu

V prvom riadku vstupu sú dve celé čísla \(N\) a \(K\) – počet koreničiek a počet najmenej štipľavých koreničiek, ktoré chce Kubo dostať na začiatok.

V druhom riadku je \(N\) rôznych celých čísel od \(1\) po \(N\), oddelených medzerami — aktuálne poradie koreničiek na poličke.

Sada 1 2 3 4
\(1 \leq N \leq\) \(20\) \(10^3\) \(10^6\) \(10^6\)

vo všetkých sadách platí \(1 \leq K \leq N\) ## Formát výstupu

Vypíšte jedno celé číslo — minimálny počet susedných výmen, ktoré musí Kubo vykonať,
aby sa najmenších \(K\) koreničiek presunulo na prvé \(K\) pozície (v ľubovoľnom poradí).

Príklad

Input:

4 2
2 3 1 4

Output:

1

Stačí vymeniť 3-ku s 1-kou

Input:

7 1 
1 6 5 7 4 2 3

Output:

0

V tomto vstupe už netreba nič vymieňať

Input:

5 3
4 1 5 3 2

Output:

5

Riešenie hrubou silou

Úlohu vieme riešiť pomocou hrubej sily. Iterujeme zľava doprava po prvých \(K\) pozíciách. Ak sa na nejakej pozícii nachádza korenička s číslom väčším než \(K\), nájde sa najbližšia správna korenička s číslom \(≤ K\) napravo a pomocou postupných susedných výmen sa presunie na túto pozíciu. Každá takáto výmena sa započíta do výsledku. Algoritmus pokračuje, kým prvých K pozícií neobsahuje iba koreničky 1 až K, pričom ich vnútorné poradie nie je dôležité. Týmto postupom sa nikdy nerobia zbytočné výmeny, pretože každá výmena rieši konkrétny problémový pár. Problémový pár je dvojica koreničiek, kde korenička s číslom väčším než K stojí pred koreničkou s číslom menším alebo rovným K, a každá takáto inverzia musí byť odstránená aspoň jednou susednou výmenou.

Optimálne riešenie

Kľúčové je uvedomiť si, že koreničky na indexoch \(i\) a \(j\) vieme vymeniť pomocou \(|i - j|\) susedných výmen, takže nie je potrebné jednotlivé výmeny simulovať. Nech \(p_i\) označuje index \(i\)-tej koreničky s číslom \(\le K\) v pôvodnom poradí poľa (číslované zľava doprava). Korenička na pozícii \(p_i\) má pred sebou presne \(p_i - i\) koreničiek s číslom väčším než \(K\), s ktorými tvorí problémové dvojice. Pole prechádzame zľava doprava. Pri každej koreničke s číslom \(\le K\) pripočítame do výsledku jej aktuálny index \(i\), čím získame hodnotu \[ \sum p_i. \] Z tejto hodnoty následne odčítame \[ \sum_{i=0}^{K-1} i = \frac{(K-1)K}{2}. \] Výsledkom je presný počet problémových dvojíc, a teda aj minimálny počet potrebných susedných výmen.

Časová a pamäťová zložitosť

Takéto riešenie bude mať časovú zložitosť \(O(n)\) a pamäťovú zložitosť \(O(1)\)

V riešení sa využíva iba lineárne iterovanie cez prvky, pričom ich nie je potrebné ukladať do pamäte. A zopár premenných.

Diskusia

Tu môžte voľne diskutovať o riešení, deliť sa o svoje kusy kódu a podobne.

Pre pridávanie komentárov sa musíš prihlásiť.