68. ročník Matematické olympiády 2018/2019

Podobné dokumenty
68. ročník Matematické olympiády 2018/2019

68. ročník Matematické olympiády 2018/2019

68. ročník Matematické olympiády 2018/2019

Úvod do řešení lineárních rovnic a jejich soustav

Ukážeme si lineární algoritmus, který pro pevné k rozhodne, zda vstupní. stromový rozklad. Poznamenejme, že je-li k součástí vstupu, pak rozhodnout

Zdůvodněte, proč funkce n lg(n) roste alespoň stejně rychle nebo rychleji než než funkce lg(n!). Symbolem lg značíme logaritmus o základu 2.

Nechť je číselná posloupnost. Pro všechna položme. Posloupnost nazýváme posloupnost částečných součtů řady.

Univerzita Karlova v Praze Pedagogická fakulta

6 Ordinální informace o kritériích

Digitální učební materiál

a se nazývá aritmetická právě tehdy, když existuje takové číslo d R

55. ročník matematické olympiády

Návrh Designu: Radek Mařík

Vprezentaci by mělo být zřetelných 7 dále uvedených bodů.

63. ročník Matematické olympiády 2013/2014

V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2

Úlohy klauzurní části školního kola kategorie B

Výhody a nevýhody jednotlivých reprezentací jsou shrnuty na konci kapitoly.

Cykly. Základy programování 1 Martin Kauer (Tomáš Kühr)

Matice. Modifikace matic eliminační metodou. α A = α a 2,1, α a 2,2,..., α a 2,n α a m,1, α a m,2,..., α a m,n

Binární soubory (datové, typované)

DYNAMICKÉ PROGRAMOVÁNÍ A PROBLÉM BATOHU

Rekurze a zásobník. Jak se vypočítá rekurzivní program? volání metody. vyšší adresy. main(){... fa(); //push ret1... } ret1

Anotace. Dámy na šachovnici dominance a nezávislost. Aritmetické výrazy, notace a převody mezi nimi, nejdelší rostoucí podposloupnost.

ALG 04. Zásobník Fronta Operace Enqueue, Dequeue, Front, Empty... Cyklická implementace fronty. Průchod stromem do šířky

Pole a Funkce. Úvod do programování 1 Tomáš Kühr

Řešení slovních úloh pomocí lineárních rovnic

60. ročník Matematické olympiády 2010/2011

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Dynamické programování

Algoritmy a datové struktury

V předchozí kapitole jsme podstatným způsobem rozšířili naši představu o tom, co je to číslo. Nadále jsou pro nás důležité především vlastnosti

5 Rekurze a zásobník. Rekurzivní volání metody

59. ročník Matematické olympiády 2009/2010

ANALYTICKÁ GEOMETRIE LINEÁRNÍCH ÚTVARŮ V ROVINĚ

BI-EP1 Efektivní programování 1

4 Stromy a les. Definice a základní vlastnosti stromů. Kostry grafů a jejich počet.

Klauzurní část školního kola kategorie A se koná

(Úlohy z MO kategorie P, 32. část)

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

IB108 Sada 1, Příklad 1 Vypracovali: Tomáš Krajča (255676), Martin Milata (256615)

66. ročník Matematické olympiády 2016/2017

Funkce, intuitivní chápání složitosti

v z t sin ψ = Po úpravě dostaneme: sin ψ = v z v p v p v p 0 sin ϕ 1, 0 < v z sin ϕ < 1.

Datové struktury. alg12 1

Úlohy krajského kola kategorie C

1 Řešení soustav lineárních rovnic

Rozklad problému na podproblémy, rekurze

Stromy, haldy, prioritní fronty

63. ročník matematické olympiády Řešení úloh krajského kola kategorie B. 1. Odečtením druhé rovnice od první a třetí od druhé dostaneme dvě rovnice

Teorie informace a kódování (KMI/TIK) Reed-Mullerovy kódy

zejména Dijkstrův algoritmus pro hledání minimální cesty a hladový algoritmus pro hledání minimální kostry.

Informatika navazující magisterské studium Přijímací zkouška z informatiky 2018 varianta A

Příklad. Řešte v : takže rovnice v zadání má v tomto případě jedno řešení. Pro má rovnice tvar

Prohledávání do šířky = algoritmus vlny

Rozklad problému na podproblémy

Náplň. v Jednoduché příklady na práci s poli v C - Vlastnosti třídění - Způsoby (algoritmy) třídění

. je zlomkem. Ten je smysluplný pro jakýkoli jmenovatel různý od nuly. Musí tedy platit = 0

Př. další použití pointerů

Úlohy domácí části I. kola kategorie C


Stromy. Jan Hnilica Počítačové modelování 14

Stromové rozklady. Definice 1. Stromový rozklad grafu G je dvojice (T, β) taková, že T je strom,

7 Kardinální informace o kritériích (část 1)

V případě jazyka Java bychom abstraktní datový typ Time reprezentující čas mohli definovat pomocí třídy takto:

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

Dynamické datové struktury IV.

Zadání a řešení testu z matematiky a zpráva o výsledcích přijímacího řízení do magisterského navazujícího studia od podzimu 2014

Hledání k-tého nejmenšího prvku

Operační systémy. Cvičení 4: Programování v C pod Unixem

Parametrické programování

Maticí typu (m, n), kde m, n jsou přirozená čísla, se rozumí soubor mn veličin a jk zapsaných do m řádků a n sloupců tvaru:

Matematická analýza III.

Stromy. Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

I. kolo kategorie Z7

Úlohy klauzurní části školního kola kategorie A

Náhodný vektor a jeho charakteristiky

5 Orientované grafy, Toky v sítích

Soustavy lineárních a kvadratických rovnic o dvou neznámých

Rozklad problému na podproblémy, rekurze

Rekurze. Pavel Töpfer, 2017 Programování 1-8 1

ŘÍKÁME, ŽE FUNKCE JE ČÁSTEČNĚ SPRÁVNÁ (PARTIALLY CORRECT), POKUD KDYŽ JE SPLNĚNA PRECONDITION

3. ÚVOD DO ANALYTICKÉ GEOMETRIE 3.1. ANALYTICKÁ GEOMETRIE PŘÍMKY

4. Rekurze. BI-EP1 Efektivní programování Martin Kačer

Řešení: PŘENESVĚŽ (N, A, B, C) = přenes N disků z A na B pomocí C

Rovnice 2 Vypracovala: Ing. Stanislava Kaděrková

Intervalové stromy. Představme si, že máme posloupnost celých čísel p 0, p 1,... p N 1, se kterou budeme. 1. Změna jednoho čísla v posloupnosti.

Algoritmizace a programování

Rekurze. Jan Hnilica Počítačové modelování 12

Časová a prostorová složitost algoritmů

PŘÍKLAD 6: Řešení: Příprava k přijímacím zkouškám na střední školy matematika 29. Určete, pro které x je hodnota výrazu 8x 6 rovna: a) 6 b) 0 c) 34

Řešení 1b Máme najít body, v nichž má funkce (, ) vázané extrémy, případně vázané lokální extrémy s podmínkou (, )=0, je-li: (, )= +,

Algoritmizace a programování

I. kolo kategorie Z9

POSLOUPNOSTI A ŘADY INVESTICE DO ROZVOJE VZDĚLÁVÁNÍ. Tento projekt je spolufinancován Evropským sociálním fondem a státním rozpočtem České republiky

Dynamické programování

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ FAKULTA STROJNÍHO INŽENÝRSTVÍ

POSLOUPNOSTI A ŘADY INVESTICE DO ROZVOJE VZDĚLÁVÁNÍ

Úlohy krajského kola kategorie A

Transkript:

68. ročník Matematické olympiády 2018/2019 Řešení úloh ústředního kola kategorie P 2. soutěžní den P-III-4 Výlet Abychom našli požadovaný výlet délky 4, stačí najít dvě hvězdy a a b, které mají dva společné sousedy v a w (hvězdy, do nichž vedou červí díry z a i z b); pak a v b w je výlet délky 4. Proto si postavíme dvourozměrné pole soused, v němž si postupně budeme pro každou dvojici hvězd určovat číslo nějaké hvězdy, která je s oběma spojena červími děrami (existuje-ji). To uděláme tak, že pro každou hvězdu v a pro každou dvojici hvězd a a b, do nichž vede červí díra z v, si do soused[a][b] poznačíme v, pokud na této pozici zatím není nic uloženo. Pokud na pozici soused[a][b] už je uloženo w, pak vypíšeme a v b w a skončíme. Naopak, pokud tímto postupem projdeme každý vrchol a všechny dvojice jeho sousedů a vždy ukládáme na prázdné pozice v poli soused, pak úloha zjevně nemá řešení. Jaká je časová složitost tohoto postupu? Na první pohled by se mohlo zdát, že je až O(n 3 ) procházíme n vrcholů a pro každý z nich procházíme dvojice z až n 1 sousedů. Nicméně si povšimněme, že do každého prvku pole soused budeme během celého postupu zapisovat nejvýše jednou, celkový počet zápisů je tedy nejvýše n 2. Jelikož v každém kroku popsaného postupu (kromě posledního) zapisujeme do pole soused, počet těchto kroků je tedy také nejvýše n 2, a proto je výsledná časová složitost O(n 2 ). Paměťová složitost je dominována velikostí pole soused a je tedy také O(n 2 ). #include <list> #define MAXN 10000 static list<int> cervi[maxn]; static vector<int> soused[maxn]; static int zaznamenej_souseda(int a, int b, int v) if (a > b) swap(a, b); int ret = soused[b][a]; soused[b][a] = v; return ret; int n, m; scanf("%d%d", &n, &m); for (int i = 0; i < m; i++) 1

int a, b; scanf("%d%d", &a, &b); a--; b--; cervi[a].push_back(b); cervi[b].push_back(a); for (int i = 0; i < n; i++) soused[i].resize(i, -1); for (int v = 0; v < n; v++) list<int> &s = cervi[v]; for (list<int>::iterator a = s.begin(); a!= s.end(); ++a) list<int>::iterator b = a; ++b; for (; b!= s.end(); ++b) int c = zaznamenej_souseda(*a, *b, v); if (c >= 0) printf("%d %d %d %d\n", *a + 1, c + 1, *b + 1, v + 1); printf("0\n"); P-III-5 Důl Nejprve si rozmysleme řešení jednodušší úlohy, kdy nemáme žádné omezení na délku pobytů horníků. V tom případě je úloha ekvivalentní určení počtu dobrých uzávorkování z n otevíracích a n zavíracích závorek (otevírací závorky odpovídají příchodům horníků, zavírací odchodům). Dobré uzávorkování vypadá tak, že na začátku je otevírací závorka, pak následuje dobré uzávorkování z i otevíracích a zavíracích závorek pro nějaké i tž. 0 i n 1, pak zavírací závorka odpovídající první otevírací, a nakonec dobré uzávorkování z n i 1 otevíracích a zavíracích závorek. Jelikož každá taková kombinace odpovídá právě jednomu dobrému uzávorkování, dostáváme pro počet z n uzávorkování z n otevíracích a zavíracích závorek následující vzorec platný pro každé n 1 (máme z 0 = 1): n 1 z n = z i z n i 1. i=0 Můžeme tedy postupně počítat z 1,..., z n, pro určení každého z nich sčítáme nejvýše n členů předchozí sumy, zabere nám to tedy čas O(n 2 ). 2

Vraťme se nyní k úloze. Oproti předchozímu případu se mění následující: první horník může pracovat pouze m minut, a tedy musí platit a 2i+2 a 1 + m. Horníci, kteří přidou dřív, než první horník odejde, také musí odejít před časem a 2i+2, a proto pro ně doba v práci nepředstavuje žádné další omezení; můžeme si tedy pro ně vybrat libovolné dobré uzávorkování z i otevíracích a zavíracích závorek. Oproti tomu možná uzávorkování pro n i 1 zbývajících horníků mohou být dobou práce omezeny. Označme si proto jako u i počet způsobů, jak dobře uzávorkovat posledních i horníků tak, aby pro ně platilo omezení na pracovní dobu. Dle výše popsané úvahy máme u n = z i u n i 1, 1 i n 1 a 2i+2 a 1+m a obdobně u m = 1 i m 1 a 2(n m+i)+2 a 2(n m)+1 +m z i u m i 1 pro 1 m n (kde u 0 = 1). Můžeme si tedy v čase O(n 2 ) spočítat u 1,..., u n dle tohoto vzorce a vypsat u m. Všechny výpočty samozřejmě provádíme modulo 1 000 003. Paměťová složitost je lineární, pamatujeme si vstup a pole obsahující hodnoty z i a u i. #define MOD 1000003 static vector<int> zavorky; static vector<int> casy; static vector<int> suffixy; static void predpocitej_zavorkovani(int n) zavorky.resize(n + 1); zavorky[0] = 1; for (int z = 1; z <= n; z++) for (int a = 0; a < z; a++) s += (long long) zavorky[a] * zavorky[z - a - 1]; zavorky[z] = s % MOD; int n, m; scanf("%d%d", &n, &m); casy.resize(2 * n); for (int i = 0; i < 2 * n; i++) scanf("%d", &casy[i]); 3

predpocitej_zavorkovani(n); suffixy.resize(n + 1); suffixy[n] = 1; for (int p = n-1; p >= 0; p--) int cp = casy[2 * p]; for (int a = 0; a + p < n; a++) if (casy[2*(p+a) + 1] > cp + m) break; s += (long long) zavorky[a] * suffixy[p+a+1]; suffixy[p] = s % MOD; printf("%d\n", suffixy[0]); P-III-6 Wienerův index Vzdálenost mezi atomy a a b označme jako d(a, b). Řešme zobecněnou úlohu: Každému atomu a přiřaďme jako váhu přirozené číslo w a, a počítejme součet w a w b d(a, b) přes všechny dvojice atomů a a b. Původní úloha odpovídá případu, kdy všechny atomy mají váhu 1. Jakožto ω označme součet všech vah. Podívejme se na poslední atom b na vstupu; ten je spojen vazbou s právě jedním atomem a. Představme si nyní, že váhu atomu a zvýšíme o w b a atom b smažeme. Jak se tímto změní (zobecněný) Wienerův index? Ze součtu jsme ztratili členy w b w c d(b, c) pro všechny atomy c b; oproti tomu nám tam (díky zvýšení váhy atomu a) přibyly členy w b w c d(a, c). Jelikož všechny cesty do b vedou přes a, máme d(b, c) = d(a, c) + 1. Proto jsme popsanou modifikací zmenšili Wienerův index o w b w c (d(b, c) d(a, c)) = w b w c = w b (ω w b ). c b Určíme-li tedy Wienerův index modifikované molekuly, přičtením členu w b (ω w b ) dostáváme výsledek. Wienerův index modifikované molekuly určíme rekurzivně opakováním tohoto postupu. Jelikož pro každý atom vykonáme jen konstantní množství práce (jeho odebrání, zvýšení váhy sousedního atomu a přičtení w b (ω w b ) k výsledku z rekurze), celková časová složitost je lineární O(n); stejná je i paměťová složitost. #define MOD 1000003 static vector<int> atomy; static vector<int> vahy; c b 4

int n; scanf("%d", &n); atomy.resize(n); vahy.resize(n, 1); for (int i = 1; i < n; i++) int s; scanf("%d", &s); atomy[i] = s - 1; for (int b = n - 1; b > 0; b--) vahy[atomy[b]] += vahy[b]; for (int b = 1; b < n; b++) s += (long long) vahy[b] * (n - vahy[b]); printf("%lld\n", s % MOD); 5