Triangulation

Time limit: 0.1s Memory limit: 64MB Input: Output:

Anna a desenat un poligon cu nn vârfuri numerotate de la 00 la n1n - 1 în ordinea acelor de ceasornic. Mai târziu a triangulat poligonul desenând n3n - 3 diagonale care nu se intersectează cu excepția posibilă a vârfurilor. O diagonală este o linie dreaptă între două vârfuri diferite care nu au o latură între ele.

Să definim mai întâi distanța de la vârful AA la diagonala DD. Să zicem că începem la vârful AA și ne deplasăm la următorul vârf în ordinea acelor de ceasornic până ajungem la unul dintre vârfurile lui DD. Numărul de muchii traversate îl numim left_distanceleft\_distance. Analog, right_distanceright\_distance este numărul de muchii traversate dacă începem de la AA și ne deplasăm în direcția opusă acelor ceasului până ajungem la DD. Distanța de la AA la DD este maximul dintre left_distanceleft\_distance și right_distanceright\_distance.

În exemplul din imagine, distanța de la vârful 00 la diagonala (1,5)(1, 5) este 22, cu left_distance=1left\_distance=1 și right_distance=2right\_distance=2. Pentru diagonala (0,5)(0, 5) distanța de la vârful 00 este 55, cu left_distance=5left\_distance=5 și right_distance=2right\_distance=2.

Cerință

Anna vrea să facă din acest lucru o provocare pentru Jacob. Jacob nu știe diagonalele desenate. El știe doar valoarea lui NN, dar o poate întreba pe Anna de mai multe ori despre perechi de vârfuri și ea îi va spune dacă se găsește o muchie între vârfurile acelea. Scopul lui Jacob este să găsească cea mai apropiată (cu noțiunea de distanță de mai sus) diagonală desenată față de vârful 00. Îl veți ajuta să își îndeplinească scopul întrebând-o pe Anna un număr limitat de întrebări.

Protocol de interacțiune

Trebuie să implementați următoarea funcție în submisia voastră:

int solve (int n);
  • Funcția se apelează exact o dată de către evaluator.
  • nn este numărul de vârfuri ale poligonului.
  • Funcția ar trebui să returneze diagonala între niște vârfuri aa și bb ca un întreg cu valoarea an+ba \cdot n + b.
  • Dacă sunt mai multe diagonale cu aceeași distanță minimă, puteți să returnați oricare.

Funcția de mai sus poate apela următoarea funcție:

int query (int x, int y);
  • xx este indicele primului vârf.
  • yy este indicele celui de-al doilea vârf.
  • 0x,yn10 \leq x, y \leq n - 1
  • Returnează 11 dacă există o diagonală între xx și yy și 00 altfel.
  • Pentru a putea apela această funcție, trebuie inclus header-ul triangulation.h în submisia voastră (#include "triangulation.h")!

Restricții și precizări

  • 5n1005 \leq n \leq 100

Punctare

Fie qq numărul de interogări ce le faceți pe un singur test. Totodată fie w=n(n3)2w = \frac{n \cdot ( n - 3)}{2}.

  • Dacă faceți o interogare invalidă sau ghiciți răspunsul incorect veți primi 0%0\% din puncte pentru un test.
  • Dacă w<qw < q veți primi 0%0\% din puncte pentru un test.
  • Dacă n<qwn < q \leq w veți primi (10+60wqwn)%(10 + 60 \cdot \frac{w - q}{w - n}) \% din puncte pentru un test.
  • Dacă qnq \leq n veți primi 100%100 \% din puncte pentru un test.

Exemplu de interacțiune

Urmează un exemplu de input pentru evaluator și apelurile de funcții corespunzătoare. Inputul este cel desenat în imaginea de mai sus.

Testare locală

Aveți la dispoziție fișierul grader_local.cpp în lista de atașamente. Cu ajutorul acestuia puteți să testați sursa local.

Singura linie din input corespunde lui nn. Evaluatorul va afișa fiecare apel al lui query la stdout și trebuie să îi răspundeți manual cu 11 sau 00.

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