Editorial for La persona en frente


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

Author: leosangue

Solución

Como las n personas están sentadas formando un círculo y n es par, cada persona tiene exactamente una persona que se encuentra en la posición diametralmente opuesta.

La persona que está en frente de k se encuentra exactamente n / 2 posiciones después de ella.

Por lo tanto, podemos calcular:

\[ j = k + \frac{n}{2} \]

Pero debemos considerar que las personas están numeradas de 1 a n. Si j > n, simplemente damos la vuelta al círculo restando n.

Una forma directa de hacerlo es:

\[ j = \begin{cases} k + \frac{n}{2} & \text{si } k \leq \frac{n}{2} \\ k - \frac{n}{2} & \text{si } k > \frac{n}{2} \end{cases} \]

Ejemplo

Para n = 6:

  • Persona 1 → 1 + 3 = 4
  • Persona 2 → 2 + 3 = 5
  • Persona 3 → 3 + 3 = 6
  • Persona 4 → 4 - 3 = 1
  • Persona 5 → 5 - 3 = 2
  • Persona 6 → 6 - 3 = 3

Así, por ejemplo, para n = 6, k = 3, la respuesta es 6.

Complejidad

Para cada caso solamente realizamos una suma o resta:

  • Tiempo: O(1)
  • Memoria: O(1)

Código en C++

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int T;
    cin >> T;

    while (T--) {
        long long n, k;
        cin >> n >> k;

        long long mitad = n / 2;

        if (k <= mitad)
            cout << k + mitad << '\n';
        else
            cout << k - mitad << '\n';
    }

    return 0;
}
Otra forma de verlo

También podemos pensar que simplemente estamos desplazando k n/2 posiciones alrededor del círculo:

\[ \boxed{\text{frente}(k) = ((k-1+n/2)\bmod n)+1} \]

Esta fórmula también funciona directamente con la numeración de 1 a n.


Comments

There are no comments at the moment.