6 - Taman
Vremensko ograničenje | Memorijsko ograničenje |
---|---|
1000ms | 128MB |
U drevnom podrumu Komisije za žalbe, nalazi se \(N\) gomila takmičarskih žalbi poređanih u niz - na \(i\)-toj gomili se nalazi \(a_i\) žalbi. Došlo je vreme da se i te žalbe odbiju pa je Glavni Arhivator Đorđe Kavurmov dobio zadatak da podeli gomile članovima komisije. Kavurmov planira da podeli ove gomile žalbi u hrpe (veće gomile) - uzastopne podnizove gomila žalbi pri čemu će svaka gomila žalbi pripadati tačno jednoj hrpi (podnizu).
Međutim, to nije trivijalan posao jer veličine hrpi moraju biti taman (akcenat na drugo 'a') tj. ni prevelike ni premale. Preciznije, za svaku hrpu mora važiti da njena veličina (broj gomila žalbi u njoj, tj. dužina podniza) nije manja od najmanje gomile koja joj pripada (jer to nema smisla) i da nije veća od najveće gomile koja joj pripada (jer je to bezveze). Kako Arhivator ne voli da radi, on je odlučio da sedi i razmišlja na koliko načina može podeliti dati niz gomila na hrpe. Zapravo, odlučio je samo da sedi a razmišljanje prepušta vama - kao nagradu, proslediće vašu žalbu nekome ko ih zapravo čita pre odbijanja.
Opisi funkcija
Potrebno je da implementirate funkciju
- \(TamanPodela(N, a[\ldots])\)
gde je \(N\) - broj gomila žalbi dok je \(a\) niz koji opisuje gomile žalbi: \(i\)-ta gomila sadrži \(a_i\) žalbi. Niz \(a\) je indeksiran od 1. Ova funkcija mora da vrati jedan ceo broj -- traženi broj podela po modulu \(1.000.000.007\) \((10^9 + 7)\). Obratiti pažnju da rešenje mora biti u segmentu \([0, 10^9 + 6]\).
Primer
Neka je \(N = 7\) i \(a = [1, 6, 2, 3, 4, 3, 4]\). Tada je niz od ovih 7 gomila žalbi moguće podeliti na hrpe na sledećih \(6\) načina: | 1 | 6 2 3 4 3 4 |, | 1 6 2 | 3 4 3 4 |, | 1 6 2 3 | 4 3 4 |, | 1 | 6 2 | 3 4 3 4 |, | 1 | 6 2 3 | 4 3 4 |, | 1 6 | 2 3 | 4 3 4 |; dakle, u ovom slučaju vaša funkcija mora vratiti broj \(6\) \(mod\) \((10^9 + 7)\) \(=\) \(6\). Obraditi pažnju da npr. podela | 1 6 | 2 3 4 3 4 | nije validna jer je veličina (dužina) desne hrpe \(5\) što je veće od najveće gomile koja joj pripada (\(4\)); takođe, podela | 1 6 2 | 3 4 | 3 4 | nije validna jer je veličina poslednje dve hrpe \(2\) što je manje od najmanjih gomila koje im pripadaju (u oba slučaja \(3\)).
Ograničenja
- \(1 \leq N \leq 500.000\)
- Za svako \(i = \overline{1,N}\) važi \(1 \leq a_i \leq N\)
Podzadaci
- Podzadatak \(1\) [\(9\) poena]: \(N \leq 1.000\).
- Podzadatak \(2\) [\(10\) poena]: \(N \leq 100.000\), \(a_i \leq 500\).
- Podzadatak \(3\) [\(12\) poena]: U nizu \(a\) postoje tačno 2 različite vrednosti.
- Podzadatak \(4\) [\(24\) poena]: Za svaki paran indeks \(i\) važi \(a_i = N\).
- Podzadatak \(5\) [\(45\) poena]: Nema dodatnih ograničenja.
Detalji implementacije
Potrebno je da pošaljete tačno jedan fajl taman.cpp
ili taman.pas
, koji implementira pomenutu funkciju. Osim tražene funkcije, vaš fajl može sadržati i dodatne globalne promenljive, pomoćne funkcije i dodatne biblioteke.
U zavisnosti od programskog jezika koji koristite, vaša funkcija/procedura mora biti sledećeg oblika:
Jezik | Deklaracija funkcije |
---|---|
C++ | int TamanPodela(int N, int a[]); |
Pascal | function TamanPodela(N : longint; var a : array of longint) : longint; |
Vašim programima je dozvoljeno da menjaju sadržaj nizova/matrica, ali ne smeju da pristupaju van granica datih nizova.
Testiranje i eksperimentisanje
Uz zadatak, obezbeđeni su vam "template" fajlovi code.cpp
i code.pas
koje možete koristiti i menjati po potrebi. Takođe su vam obezbeđeni programi grader.cpp
, grader.pas
koji služe da lakše testirate kodove. Ovi programi učitavaju sa standardnog ulaza sledeće podatke:
- U prvom redu broj \(N\),
- U narednom redu \(N\) brojeva, elemente niza \(a\)
a zatim pozivaju vašu funkciju sa učitanim parametrima i, na kraju, vrednost koju vaša funkcija vraća ispisuju na standardni izlaz. Kodove ovih programa možete menjati po potrebi.
Autor | Tekst i test primeri | Analiza rеšenja | Testiranje |
---|---|---|---|
Nikola Milosavljević | Nikola Milosavljević | Bhuvnesh Jain | Ivan Stošić |
Možete pročitati editorijal na engleskom (CodeChef je koristio naš zadatak za Challenge rundu): Link