Kolej (Rail)
Transkrypt
Kolej (Rail)
InternationalOlympiadinInformatics2014 13-20thJuly2014 Taipei,Taiwan Day-1tasks rail Language:pl-PL Kolej(Rail) NaTajwanieznajdujesiędługaliniakolejowałączącazachodnieiwschodniewybrzeżewyspy.Linia taskładasięz bloków.Kolejneblokisąponumerowane ,począwszyodzachodniego końcalinii.Wkażdymblokuznajdujesięjednokierunkowytorbiegnącynazachódpołożonynapółnocy blokuorazjednokierunkowytorbiegnącynawschódpołożonynapołudniubloku.Międzytoramibloku możeznajdowaćsięstacjakolejowa. Możliwesątrzytypybloków.BloktypuCzawierastacjękolejową,naktórąwjeżdżasięztoru północnegoiktórąopuszczasiętorempołudniowym.BloktypuDzawierastacjękolejową,naktórą wjeżdżasięztorupołudniowegoiktórąopuszczasiętorempółnocnym.Blokpustyniezawierastacji kolejowej.Dlaprzykładu,naponiższymrysunkubloki0,4i6sąpuste,bloki1,2i3sątypuC,ablok5 jesttypuD.Torywkolejnychblokachsąpołączonezapomocąłączników;sąoneprzedstawionena rysunkujakozaciemnioneprostokąciki. Systemkolejowyzawiera stacjiponumerowanychod0do .Należyzałożyć,żezapomocą torówkolejowychmożnadotrzećzkażdejstacjidokażdejinnejstacji.Przykładowo,abydotrzeć zestacji0dostacji2,należyzacząćwbloku2,następnieprzejechaćprzezbloki3i4,używająctorów południowych,późniejprzejechaćprzezblok5,atymsamymstację1,następnieprzejechaćprzezblok 4,używająctorupółnocnego,bynakońcudojechaćdostacji2wbloku3. Jakożemożebyćwięcejniżjednatrasa,odległośćmiędzydwiemastacjamidefiniujemyjako minimalnąliczbęłącznikównaścieżcemiędzytymistacjami.Dlaprzykładu,najkrótszaścieżkaze stacji0dostacji2biegnieblokami2-3-4-5-4-3iprzechodziprzez5łączników,więcodległośćmiędzy tymidwiemastacjamijestrówna5. Strukturasystemukolejowegobyłaprzechowywanazużyciemspecjalnegooprogramowania.Niestety usterkazasilaniaspowodowałauszkodzeniedanychprogramu,przezcoinformacjeopołożeniachstacji itypachblokówzostałyutracone.Wpamięcipozostałatylkoinformacjaonumerzebloku,wktórym znajdujesięstacja0,orazinformacja,żejesttobloktypuC.Szczęśliwie,programwciążpozwala odpowiadaćnazapytaniaoodległośćmiędzydowolnąparąstacji.Przykładowo,wprogramiemożemy zapytać:„Jakajestodległośćodstacji0dostacji2"iuzyskaćodpowiedź:5. Zadanie NapiszfunkcjęfindLocation,któraokreślidlakażdejstacjinumeroraztypbloku,wktórymta 1/3 stacjasięznajduje. findLocation(n,first,location,stype) n:liczbastacji. first:numerbloku,wktórymznajdujesięstacja0. location:tablicarozmiaru ;location[i]powinnonakońcudziałaniafunkcji zawieraćnumerbloku,wktórymznajdujesięstacja . stype:tablicarozmiaru ;stype[i]powinnonakońcudziałaniafunkcjizawieraćtyp bloku,wktórymznajdujesięstacja :1dlatypuC,a2dlatypuD. PrzyustalaniupołożeńitypówstacjiTwojafunkcjamożeużywaćfunkcjigetDistance: getDistance(i,j)dajewwynikuodległośćodstacjiidostacjij.getDistance(i,i) dajewynik0.getDistance(i,j)dajewynik-1,jeśliilubjznajdujesiępozazakresem . Podzadania Wewszystkichpodzadaniachliczbabloków nieprzekracza1,000,000.Wniektórychpodzadaniach liczbawywołańfunkcjigetDistancejestograniczona.Ograniczenietozależyodkonkretnego podzadania.JeśliTwójprogramprzekroczytoograniczenie,otrzymawynik'wronganswer',. maxliczba wywołań dodatkoweograniczenia getDistance brak Wszystkiestacjepozastacją0znajdują ograniczeń sięwblokachtypuD. Wszystkiestacjepołożonenawschód odstacji0znajdująsięwblokachtypu brak D,awszystkiestacjepołożonena ograniczeń zachódodstacji0znajdująsięw blokachtypuC. podzadanie liczba punktów 1 8 2 22 3 26 brak 4 44 brak Implementacja Powinieneśzgłosićdokładniejedenplikonazwierail.c,rail.cpplubrail.pas.Wpliku powinnaznaleźćsięimplementacjafunkcjifindLocationopisanejpowyżej,onastępującej sygnaturze.WprzypadkuprogramuwC/C++powinieneśtakżezałączyć(include)pliknagłówkowy rail.h. ProgramywC/C++ voidfindLocation(intn,intfirst,intlocation[],intstype[]); 2/3 ProgramywPascalu procedurefindLocation(n,first:longint;varlocation, stype:arrayoflongint); SygnaturyfunkcjigetDistancesąnastępujące. ProgramywC/C++ intgetDistance(inti,intj); ProgramywPascalu functiongetDistance(i,j:longint):longint; Przykładowyprogramsprawdzający Przykładowyprogramsprawdzającywczytujedanewnastępującymformacie: wiersz1:numerpodzadania wiersz2:n wiersz ,( ):stype[i](1dlatypuCi2dlatypuD),location[i]. PrzykładowyprogramsprawdzającywypiszekomunikatCorrect,jeślilocation[0]... location[n-1]orazstype[0]...stype[n-1]nakońcuwywołaniaTwojejfunkcji findLocationbędąidentyczneztymipodanyminawejściu,aIncorrect,jeśliniesąone identyczne. 3/3