Zadanie

Pastier Larry má problém. Kolmo cez pasienku kde sa pasú jeho ovečky prechádza prekliata rieka nekonečného zatratenia a bolesti. Ovečku, ktorá by do nej omylom padla čaká neistý ale nepredstaviteľne mrzký osud. Navyše strata akejkoľvek ovečky prináša pre chudobného pastiera značnú ekonomickú škodu. Larry má ale nápad ako túto hrozbu mitigovať.

V stodole má k dispozícii niekoľko veľkých obdĺžnikových oceľových plátov. Pripevní ich cez rieku, aby po nich mohli ovečky bezpečne prechádzať na druhú stranu. Pasienka má členitý terén a rieka má nerovné brehy, takže pláty nemôže namontovať kam len chce, ale našiel nejaké potenciálne miesta kde sa to dá. Všetky majú rovnakú veľkosť a otočenie (sú rovnobežné s riekou).

Čím viac plátov pastier Larry rozmiestni, tým menej ovečiek stratí. Ale pláty sa nesmú prekrývať, aby sa nenarušila ich stabilita. Poraďte pastierovi Larryho, koľko najviac plátov môže cez rieku pripevniť.

Úloha

Pôdorys pasienky je nekonečná 2D rovina. Rieku si môžeme predstaviť ako priamku \(y=0\).1 Na pasienke je \(n\) osovo zarovnaných obdĺžnikov, čo sú miesta kde Larry môže potenciálne umiestniť plát. Všetky majú rovnakú šírku \(s\) a výšku \(v\) a pretínajú rieku.

Vyber na ktoré miesta má Larry namontovať oceľový plát a na ktoré nie, tak aby ich bolo čo najviac ale žiadne vybraté miesta sa neprekrývali. Dotýkať sa môžu.

Formát vstupu

V prvom riadku vstupu je číslo \(n\) udávajúce počet potenciálnych obdĺžnikov.

V druhom riadku je prirodzené číslo \(s\) a v treťom riadku prirodzené číslo \(v\), určujúce šírku a výšku každého obdĺžnika.

Nasleduje \(n\) riadkov ktoré popisujú jednotlivé potenciálne miesta. V každom sú dve celé čísla \(x\) a \(y\), čo predstavuje obdĺžnik ktorého štyri rohy sú \((x,y)\), \((x+s,y)\), \((x,y+v)\) a \((x+s,y+v)\). Všetky obdĺžniky pretínajú rieku, čiže \(y < 0 < y+v\). Všetky obdĺžniky na vstupe sú navzájom rôzne. Obdĺžniky sú zoradené vzostupne podľa ich \(x\)-ovej súradnice. Ak majú viaceré rovnaké \(x\), môžu byť medzi sebou zoradené akokoľvek.

Sú 4 sady vstupov, v ktorých platia tieto obmedzenia:

Sada 1 2 3 4
\(1 \leq n \leq\) \(10\) \(100\) \(1\,000\) \(10\,000\)
\(1 \leq s \leq\) \(10\) \(100\) \(100\,000\) \(100\,000\)
\(2 \leq v \leq\) \(10\) \(100\) \(100\,000\) \(100\,000\)
\(|x| \leq\) \(10\) \(1\,000\) \(1\,000\,000\) \(1\,000\,000\)

Formát výstupu

Vypíš jedno číslo: veľkost najväčšej podmnožiny vzájomne sa neprekryvajúcich obdĺžnikov.

Príklady

Input:

4
2
5
-5 -4
-4 -3
-1 -1
1 -2

Output:

3

Prvé 2 obdĺžniky sa prekrývajú, preto musíme vybrať práve jeden z nich. Je jedno ktorý. Ostatné sa s nijakým obdĺžnikom neprekrývajú, iba dotýkajú, takže ich vyberieme oba. Maximum je teda 3.

Keďže všetky obdĺžniky pretínajú os \(y=0\), či sa pretínajú alebo nie závisí len od ich \(x\)-ovej súradnice. \(y\)-ovú súradnicu tak môžeme ignorovať.

Naše riešenie použije greedy pravidlo: Prejdeme zľava doprava a vyberieme každý obdĺžnik, ktorý sa neprekrýva so žiadnym čo sme už vybrali. Čiže ak sa nejaké dva prekrývajú, vyberieme ten ľavejší z nich. Keby sme vybrali ten viac vpravo, a za nimi by bol tretí čo sa prekrýva s druhým ale nie s prvým, nemohli by sme ho vybrať.

Táto úvaha sa opiera o fakt, že obdĺžniky majú v tejto úlohe rovnakú šírku. Vďaka tomu vieme, že ten čo viac vľavo začína aj viac vľavo končí. Ak ho zoberieme, nemôže nám to uškodiť a možno vďaka tomu neskôr budeme môcť vybrať ďalší obdĺžník, ktorý by bol v inom prípade zbytočne zablokovaný. Keby mali rôzne šírky mohlo by nastať, že ten ľavý je hrozne široký a nehodí sa ho zobrať, čo by bola ťažšia úloha.

Takže implementácia bude vyzerať takto: budeme si pamätať koľko obdĺžnikov sme už vybrali a kde sa nachádzal posledný vybraný. Potom postupne čítame polohy obdĺžníkov – našťastie už sú na vstupe zoradené podľa \(x\). Ak sa neprekrýva s posledným čo sme vybrali alebo je prvý na vstupe, inkrementujeme počet a zapamätáme si kde je. Časová zložitosť je \(O(n)\).

Všimnime si, že polohy obdĺžnikov ani nemusíme načítať do poľa, môžeme každú vyhodnotiť a spracovať okamžite keď ju prečítame. Optimálna pamäťová zložitosť je preto \(O(1)\). Mimochodom takéto algoritmy, ktoré dokážu spracovať vstup za behu, bez toho, že by ho celý vopred načítali, sa volajú “online algoritmy”.

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ť.