Hipermetropie

Time limit: 1s Memory limit: 256MB Input: Output:

Pe vremea când dacii încă se luptau cu samuraii, într-un colț ascuns al lumii, exista orașul Hipermetropolis, cea mai avansată civilizație din punct de vedere tehnologic de până atunci. Conducătorul acestui oraș, Regele Hip, era un om pasionat de logică și jocuri, așa că își făcea supușii să participe la diferite jocuri care le testau perspicacitatea.

Ne întoarcem în timp într-o zi aleatorie din orașul Hipermetropolis și aflăm că jocul de astăzi este următorul:

Regele alege NN supuși (logicieni perfecți) și îi pune într-o pădure (o mulțime de arbori) cu NN noduri și MM muchii neorientate, fiecare supus fiind într-un nod diferit. Ca toți locuitorii orașului Hipermetropolis, ei sunt hipermetropi (nu pot vedea bine în apropierea lor), așa că un supus nu poate vedea muchiile incidente nodului său, însă poate vedea toate celelalte muchii și toate celelalte noduri.

La începutul jocului, Regele proclamă în fața tuturor supușilor:

„Graful în care vă aflați este o pădure cu cel puțin o muchie.”

După ce supușii primesc această informație, jocul începe. Acesta se desfășoară pe parcursul mai multor runde: la începutul rundei, regele ia pe rând supusul din nodul 11, apoi pe cel din nodul 22 ș.a.m.d., și îi întreabă, în secret: „Poți spune cu certitudine că ai cel puțin o muchie incidentă cu nodul tău?”, la care supusul răspunde cu Da sau Nu.

ATENȚIE: regele păstrează secret răspunsul fiecărui participant. Când se termină o rundă, dacă cel puțin un supus a răspuns cu Da, atunci jocul se încheie. În caz contrar, jocul continuă cu o nouă rundă, supușii deducând că toate răspunsurile au fost negative.

Detalii de implementare

Date fiind valorile NN, MM și cele MM muchii, se cere determinarea rundei în care se termină jocul, precum și a supușilor care răspund cu Da în acea rundă.

Se cere implementarea următoarei funcții:

std::pair<int, std::vector<int>> solve(int N, std::vector<int> u, std::vector<int> v);

care primește ca parametri:

  • NN, numărul de noduri din graf.
  • uu, vector de mărime MM
  • vv, vector de mărime MM

cu semnificația că există muchie neorientată de la uiu_i la viv_i,  i,0i<M\forall \ i , 0 \leq i < M.
Supușii pot fi returnați în orice ordine.
Comisia va apela funcția exact o dată pentru fiecare test.

Restricții și precizări

  • 1M<N500 0001 \leq M < N \leq 500 \ 000
  • 1vi,uiN1 \leq v_i, u_i \leq N și viuiv_i \neq u_i,  0i<M\forall \ 0 \leq i < M
  • Graful descris în datele de intrare este o pădure. Cu alte cuvinte, nu are cicluri.
  • Supușii sunt logicieni perfecți și cunosc faptul că toți ceilalți sunt logicieni perfecți.
  • Un logician perfect este definit astfel: dacă are suficiente informații să deducă XX, va deduce XX.
  • Un supus nu va minți niciodată și va răspunde cu Da cât mai repede posibil.
  • Se poate demonstra că jocul se termină într-un număr finit de runde.
  • Supușii cunosc regulile jocului.
  • Toți supușii acceptă mesajul regelui ca fiind adevărat.
  • Prima rundă este runda 11.
# Punctaj Restricții
1 7 M2M \leq 2
2 12 Fiecare nod are cel mult o muchie incidentă.
3 28 N20N \leq 20
4 22 N2 000N \leq 2 \ 000
5 31 Fără restricții suplimentare.

Exemplul 1

input

3 2
1 2
1 3

output

1
1

Explicație

Supusul 11 nu vede nicio muchie în graf și deduce că trebuie să existe cel puțin o muchie incidentă cu el, ceea ce îl face să răspundă cu Da” în prima rundă. Ceilalți doi supuși răspund cu Nu la întrebarea regelui deoarece văd câte o altă muchie.

Exemplul 2

input

4 2
1 2
3 4

output

2
1 2 3 4

Explicație

În prima rundă fiecare supus vede câte o muchie, așa că toată lumea răspunde cu Nu. În a doua rundă, supusul 11 raționează astfel: „În prima rundă, supusul 33 a văzut o muchie, dar el este incident cu singura muchie pe care o văd eu: muchia (3,4)(3, 4), muchie pe care supusul 33 nu o vede. Asta înseamnă că el trebuie să fi văzut o muchie pe care nu o văd eu, adică o muchie incidentă cu mine.” Ceilalți 33 supuși raționează analog, și toată lumea răspunde cu Da

Log in or sign up to be able to send submissions!