█████████ ████ ███░░░░░███ ░░███ ███ ░░░ ██████ ███████ ██████ ██████ ░███ ███░░███ ███░░███ ███░░███ ███░░███ ░███ ░███ ░███░███ ░███ ░███████ ░███ ░███ ░░███ ███░███ ░███░███ ░███ ░███░░░ ░███ ░███ ░░█████████ ░░██████ ░░████████░░██████ ░░██████ ░░░░░░░░░ ░░░░░░ ░░░░░░░░ ░░░░░░ ░░░░░░

Envío 5207

Problema 0x99 - Máquina para barajar cartas

  • Autor: alejopelaez
  • Fecha: 2021-10-27 17:16:05 UTC (Hace más de 2 años)
Caso # Resultado Tiempo Memoria
#1
Correcto
0.006 s 0 KBi
#2
Correcto
0.005 s 1 KBi
#3
Correcto
0.006 s 0 KBi
#4
Correcto
0.005 s 1 KBi
#5
Correcto
0.004 s 4 KBi
#6
Correcto
0.273 s 8 KBi
#7
Correcto
0.346 s 8 KBi
#8
Incorrecto
0.005 s 4 KBi
#9
Correcto
0.004 s 0 KBi
#10
Correcto
0.003 s 0 KBi
#11
Correcto
0.005 s 1 KBi
#12
Correcto
0.033 s 1 KBi
#13
Correcto
0.043 s 1 KBi
#14
Incorrecto
0.035 s 1 KBi
#15
Incorrecto
0.035 s 1 KBi
#16
Incorrecto
0.031 s 1 KBi
#17
Incorrecto
0.005 s 0 KBi
#18
Incorrecto
0.005 s 0 KBi
#19
Correcto
0.003 s 1 KBi
#20
Correcto
0.004 s 2 KBi
#21
Incorrecto
0.368 s 7 KBi
#22
Incorrecto
0.347 s 11 KBi
#23
Incorrecto
0.3 s 8 KBi
#24
Correcto
0.371 s 11 KBi
#25
Incorrecto
0.405 s 9 KBi
Puntos totales: 60 / 100

Código

#include <iostream>
#include <unordered_set>
#include <unordered_map>
#include <map>
#include <vector>
using namespace std;

using Permutation = std::unordered_map<int64_t, int64_t>;
using Cycle = std::vector<int64_t>;

void cyclePower(Cycle cycle, int64_t exponent, Permutation& outResult) {
  int64_t rotation = exponent % cycle.size();
  Permutation result;
  unordered_set<int64_t> seen;
  
  for (int32_t i = 0; i < cycle.size(); ++i) {
    Cycle result;
    int64_t currIdx = i;
    while (seen.count(currIdx) == 0) {
      seen.insert(currIdx);
      auto nextIdx = (currIdx + rotation) % cycle.size();
      outResult[cycle[nextIdx]] = cycle[currIdx];
      currIdx = nextIdx;
    }  
  }
}

void printPerm(Cycle cycle) {
  for (auto elem : cycle) {
    cout << elem << " ";
  }
  cout << endl;
}

int main() {
  int64_t N, R;

  cin >> N >> R;
  cin.ignore(1, '\n');

  std::vector<int64_t> input;
  for (int64_t i = 0; i < N; i++) {
    int num;
    cin >> num;
    input.push_back(num);
  }

  std::vector<Cycle> cycles;

  Cycle cycle;
  int32_t processed = 0;
  int64_t curr = 0;
  unordered_set<int64_t> seen;
  while (processed < N) {
    cycle.push_back(curr);
    seen.insert(curr);
    curr = input[curr];

    if (seen.count(curr) > 0) {
      seen.clear();
      cycles.push_back(std::move(cycle));
      cycle = {};
      curr = processed + 1;
    }
    processed += 1;
  }

  Permutation result;
  int i = 0;
  for (auto& cycle : cycles) {
    cyclePower(cycle, R, result);    
  }  

  for (int i = 0; i < N; ++i) {
    cout << result[i] + 1;
    if (i < N-1) {
      cout << " ";
    }
  }

  return 0;
}