Problemi 040

Kërkesa

Një listë L ka N numra të plotë të ndryshëm nga zero. Një nën-listë quhet alternuese nëse çdo dy elemente fqinje të listës kanë shenja të kundërta (njëra pozitive dhe tjetra negative).

Për çdo element të listës L gjeni gjatësinë e nën-listës alternuese më të madhe që fillon me atë element.

Referenca: https://www.codechef.com/problems/ALTARAY

Shembull

$ cat input.txt
3
4
1 2 3 4
4
1 -5 1 -5
6
-5 -1 -1 2 -2 -3

$ python3 prog.py < input.txt
1 1 1 1
4 3 2 1
1 1 3 2 1 1

Zgjidhja 1

Sqarime

Për çdo element të listës gjejmë se sa elemente alternuese janë mbas tij. Kushtin i+k < N e përdorim për tu siguruar që indeksi (treguesi) i+k nuk del jashtë listës. Kurse kushtin x*y < 0 e përdorim për të kontrolluar që dy elementë kanë shenja të kundërta.

Komanda print(*P) përdoret për të printuar elementet e një liste, të ndarë me vende bosh.

Zgjidhja 2

Sqarime

Kjo zgjidhje bazohet në faktin që gjatësitë e nën-listave më të mëdha alternuese për dy elemente të një-pas-njëshëm i dhe i+1 kanë lidhje me njëra-tjetrën. Nëse elementët i dhe i+1 kanë shenja të kundërta, atëherë gjatësia për elementin i është një më tepër sesa për elementin i+1. Nëse kanë shenja të njëjta, atere është 1.

Kështu që zgjidhja bëhet duke filluar nga fundi i listës dhe duke llogaritur gjatësinë për një element duke u bazuar te gjatësia e elementit pasardhës. Elementi i fundit i listës përbën një rast të veçantë, sepse nuk ka element para-ardhës, kështu që ne shtojmë një element fallco në fund të listës, thjesht për të shmangur trajtimin e tij si rast i veçantë.

Kjo zgjidhje mund të duket pak më e vështirë për tu konceptuar në krahasim me zgjidhjen e parë, por në fakt është më e shpejtë. Zgjidhja e parë është zgjidhje katrore (ose e rendit \(O(N^2)\)) meqenëse kemi dy cikle brenda njëri-tjetrit. Kurse kjo zgjidhje është lineare (ose e rendit \(O(N)\)) meqenëse kemi vetëm një cikël.

Që zgjidhja e dytë është më e shpejtë mund ta provoni edhe duke i provuar këto zgjidhje këtu: https://www.codechef.com/submit/ALTARAY Zgjidhja e parë nuk e kalon testin sepse është shumë e ngadalshme, kurse e dyta po.

Detyra

Një listë L ka N numra të plotë të ndryshëm nga zero. Një nën-listë quhet alternuese nëse çdo dy elemente fqinje të listës kanë shenja të kundërta (njëra pozitive dhe tjetra negative).

Gjeni gjatësinë e nën-listës alternuese më të madhe të listës L.

Shembull

$ cat input.txt
3
4
1 2 3 4
4
1 -5 1 -5
6
-5 -1 -1 2 -2 -3

$ python3 prog.py < input.txt
1
4
3