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

Envío 5208

Problema 0x99 - Máquina para barajar cartas

  • Autor: alejopelaez
  • Fecha: 2021-10-27 18:09:35 UTC (Hace más de 2 años)
Caso # Resultado Tiempo Memoria
#1
Correcto
0.004 s 0 KBi
#2
Correcto
0.005 s 0 KBi
#3
Correcto
0.004 s 0 KBi
#4
Correcto
0.004 s 1 KBi
#5
Correcto
0.004 s 1 KBi
#6
Correcto
0.305 s 12 KBi
#7
Correcto
0.334 s 12 KBi
#8
Correcto
0.004 s 1 KBi
#9
Correcto
0.004 s 0 KBi
#10
Correcto
0.005 s 0 KBi
#11
Correcto
0.004 s 0 KBi
#12
Correcto
0.045 s 2 KBi
#13
Correcto
0.028 s 2 KBi
#14
Correcto
0.036 s 1 KBi
#15
Correcto
0.029 s 1 KBi
#16
Correcto
0.031 s 2 KBi
#17
Correcto
0.003 s 2 KBi
#18
Correcto
0.004 s 0 KBi
#19
Correcto
0.005 s 0 KBi
#20
Correcto
0.004 s 0 KBi
#21
Correcto
0.307 s 11 KBi
#22
Correcto
0.385 s 13 KBi
#23
Correcto
0.425 s 11 KBi
#24
Correcto
0.325 s 15 KBi
#25
Correcto
0.292 s 12 KBi
Puntos totales: 100 / 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) {
    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;
    }  
  }
}

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;

  for(int start = 0; start < N; ++start) {
    if (seen.count(start) > 0) {
      continue;
    }

    cycle.push_back(start);
    seen.insert(start);
    auto curr = input[start];
    while (seen.count(curr) == 0) {
      cycle.push_back(curr);
      seen.insert(curr);
      curr = input[curr];      
    }
    cycles.push_back(std::move(cycle));
    cycle = {};
  }

  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;
}