Revizia anterioară Revizia următoare
Solutii Autumn WarmUp 2020
- Lista de probleme
- Nave Interdimensionale
- Defrisare
- Cuantictiori
Solutia problemei Nave Interdimensionale
Pentru primele subtaskuri vezi soluţia problemei naveplanare
Pentru 100 de puncte vom folosi un greedy în care mutăm navele pe rând pentru a obţine o linie/coloană (liniile şi coloanele sunt de fapt independente) nouă pe care se află cel puţin o navă.
Fie pentru
numărul de nave care trec dinspre poziţia
spre poziţia
. Dacă
este negativ, el va reprezenta numărul de nave care trec dinspre poziţia
spre poziţia
înmulţit cu
.
Observăm acum că costul aferent mişcării unei nave din în
cu
va fi numărul de valori
mai mari sau egale cu
minus numărul de valori
strict mai mici decât
în intervalul
.
De ce? Pentru că dacă este mai mare sau egal decât
, înseamnă că trebuie să consumăm o secundă pentru a mişca nava între
şi
. Dacă
este mai mic decât
, am putea economisi o secundă: în loc să mişcăm nava asta spre dreapta, vom opri una dintre navele care se mişcă dinspre
spre
şi vom obţine acelaşi rezultat.
Există mai multe metode în Valoarea Maximă pe care o poate lua o coordonată
de a găsi mişcarea cea mai ieftină. Trebuie apoi să updatăm valorile din
şi să reluăm algoritmul până când numărul de linii care conţin cel puţin o navă este cel dorit.
Complexitatea finală este
Solutia problemei Defrisare
Subtaskul 1
Cum putem să folosim metoda
pentru a fixa direcţia în care va cădea fiecare copac.
Subtaskul 2
Arborele are forma unui vector.
Putem să ne folosim de programarea dinamică pentru a calcula numarul optim de operaţii necesare pentru fiecare nod dacă acesta este orientat spre stânga sau spre dreapta.
numarul minim de operatii necesare pentru ca toti copacii aflati in stanga nodului
sa pice dacă acesta cade spre stânga.
numarul minim de operatii necesare pentru ca toti copacii aflati in stanga nodului
sa pice dacă acesta cade spre dreapta.
Iniţial presupunând ca niciun copac nu are înălţimea mai mare ca
.
Dacă înseamnă că pot să tai copacul
astfel încât să pice pe copacul curent, caz în care updatez
Dacă înseamnă că pot să tai copacul curent astfel încât să pice pe copacul
, caz în care updatez
Subtaskul 3
Pentru acest subtask există cazuri:
Există două noduri
şi
legate de radacină prin muchii de lungimi
, respectiv
astfel încât
şi
. Răspunsul este
.
Există un nod
legat de radacină printr-o muchie de lungime
astfel încât
sau
. Răspunsul este
.
Nu există nicio muchie a cărei lungimi este mai mică decât înălţimea unuia dintre copacii pe care îi leagă. Răspunsul este
.
Subtaskul 4
Pentru a rezolva acest subtask vom folosi o abordare similară cu cea de la subtaskul .
Definim:
numărul minim de operaţii necesare pentru a rezolva subarborele nodului
dacă acesta cade spre unul dintre fii şi nu este doborât de alt fiu.
poate să nu atingă niciun alt copac.
numărul minim de operaţii necesare pentru a rezolva subarborele nodului
dacă acesta cade spre unul dintre fii şi este doborât de alt fiu
numărul minim de operaţii necesare pentru a rezolva subarborele nodului
dacă acesta cade spre radacină.
poate să nu fie atins de niciun alt copac.
![BEST[Nod] = min(DP[Nod][0], \hspace{0.1cm} DP[Nod][1], \hspace{0.1cm} DP[Nod][2]) BEST[Nod] = min(DP[Nod][0], \hspace{0.1cm} DP[Nod][1], \hspace{0.1cm} DP[Nod][2])](http://www.infoarena.ro/static/images/latex/71929015a2e19ac9b5a6299febf4c9a6_3.5pt.gif)
Rădăcina poate să fie orice nod cu grad mai mic sau egal cu .
Să presupunem că ne aflăm în nodul cu fii
şi
de care se leagă prin muchiile de lungime
respectiv
.
Iniţializăm cu
caz în care tai copacul curent fără să afecteze/ să fie afectat de subarborii lui
şi
.
Dacă poate să doboare copacul
atunci updatez
. Analog pentru
.
Dacă poate să doboare copacul curent atunci updatez
. Analog pentru
.
Dacă poate sa doboare copacul curent şi
poate să doboare copacul
atunci updatez
. Deoarece unesc două lanţuri numarul de operaţii necesare se micşorează cu 1. Analog pentru cazul
.
Subtaskul 5
Soluţia se bazeaza pe acelaşi ca la subtaskul 4.
Pentru fiecare nod o să avem nevoie de o variabilă în care reţinem .
şi
se calculează similar.
Pentru a calcula încercăm să cuplăm nodul curent cu fiecare fiu
pe rând considerând că
este doborât de copacul curent.
Avem însă nevoie să ştim ce fiu e optim să considerăm că doboară copacul .
Să presupunem că exista doi fii şi
care pot să cadă spre nodul actual. Considerăm că
este mai bun ca
dacă
. Astfel avem nevoie doar de primele două cele mai bune noduri care pot fi determinate printr-o singură parcurgere a fiilor nodului actual.
Solutia problemei Cuantictiori
Se asigură că se poate demonstra că numărul de progresii geometrice de lungime
care au prima valoare egală cu
este egal cu cel mai mare număr natural
cu proprietatea că
este divizor al lui
.
Pentru demonstraţie vedeţi soluţia problemei nambartiori.
Fie cel mai mare divizor comun al exponenţilor din descompunerea în factori primi a lui
.
Vom demonstra mai întai că dacă , atunci
cu
numai dacă
se află de asemenea şi în
. (Lema 1)
Fie astfel încât
şi
şi
cu proprietatea că
, astfel încât
.
Atunci şi deci
.
Dacă şi
sunt exponenţii factorului prim
din descompunerea în factori primi a numerelor
şi respectiv
, reiese că:
.
Ştim că , deci
va trebui să fie divizibil cu
şi
va trebui să fie divizibil cu
.
Ştiind că acest lucru se aplică pentru orice număr prim , putem deci spune că toţi exponenţii din descompunerea în factori primi a numărului
vor fi divizibili cu
.
Deci cel mai mare divizor comun al exponenţilor din descompunerea în factori primi a numărului va fi divizibil cu
.
Din moment ce , va trebui ca şi
să fie egal cu
.
Atunci , ceea ce trebuia demonstrat.
Dacă este primul termen,
este raţia şi progresia cuantică are lungimea
, condiţia de existenţă este următoarea:
este natural pentru oricare
.
Fie astfel încât
. Intuitiv,
. Înlocuind mai sus, obţinem:
este natural pentru oricare
.
Folosing Lema 1, obţinem că:
este natural pentru oricare
.
Observăm astfel că am ajuns la problema nambartiori, doar că aplicata valorii .
Subtaskul 2
Putem să trecem prin fiecare numar, să-i calculam -ul si să-i aplicam functia din nambartiori ca apoi să-l adaugam la rezultat.
Subtaskul 3
Observăm că un numar ne interesează doar dacă
. Asta înseamnă că în loc să trecem prin toate numerele pana la
, putem pur şi simplu să mergem prin bazele acestor numere până în
. Prin baze ne referim la numerele
cu proprietatea că
.