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