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

Envío 5206

Problema 0x99 - Máquina para barajar cartas

  • Autor: alejopelaez
  • Fecha: 2021-10-27 17:00:20 UTC (Hace más de 2 años)
Caso # Resultado Tiempo Memoria
#1
Correcto
0.004 s 20 KBi
#2
Correcto
0.004 s 31 KBi
#3
Correcto
0.006 s 0 KBi
#4
Correcto
0.005 s 31 KBi
#5
Correcto
0.007 s 0 KBi
#6
Correcto
0.304 s 4 KBi
#7
Correcto
0.394 s 4 KBi
#8
Incorrecto
0.005 s 17 KBi
#9
Correcto
0.005 s 11 KBi
#10
Correcto
0.003 s 17 KBi
#11
Correcto
0.004 s 7 KBi
#12
Incorrecto
0.037 s 2 KBi
#13
Incorrecto
0.035 s 2 KBi
#14
Incorrecto
0.028 s 1 KBi
#15
Incorrecto
0.031 s 2 KBi
#16
Incorrecto
0.041 s 1 KBi
#17
Incorrecto
0.007 s 0 KBi
#18
Incorrecto
0.005 s 47 KBi
#19
Correcto
0.005 s 11 KBi
#20
Correcto
0.003 s 18 KBi
#21
Incorrecto
0.392 s 6 KBi
#22
Incorrecto
0.38 s 9 KBi
#23
Incorrecto
0.359 s 5 KBi
#24
Correcto
0.437 s 7 KBi
#25
Incorrecto
0.436 s 7 KBi
Puntos totales: 52 / 100

Código

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

using Permutation = std::vector<int64_t>;

// Cycle power might give multiple cycles back
std::vector<Permutation> cyclePower(Permutation cycle, int64_t exponent) {
  int64_t rotation = exponent % cycle.size();
  std::vector<Permutation> results;
  unordered_set<int64_t> seen;
  
  for (int32_t i = 0; i < cycle.size(); ++i) {
    Permutation result;
    int64_t currIdx = i;
    while (seen.count(currIdx) == 0) {
      seen.insert(currIdx);
      result.push_back(cycle[currIdx]);
      currIdx = (currIdx + rotation) % cycle.size();
    }
    if (!result.empty()) {
      results.push_back(std::move(result));
    }    
  }
  return results;
}

void printPerm(Permutation 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<Permutation> cycles;

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

  std::vector<int64_t> result;
  int i = 0;
  for (auto& cycle : cycles) {
    auto tmpCycles = cyclePower(cycle, R);
    for (auto tmpCycle : tmpCycles) {
      std::map<int64_t, int64_t> invMapping;
      for (int i = 0; i < tmpCycle.size(); ++i) {
        invMapping[tmpCycle[(i+1) % tmpCycle.size()]] = tmpCycle[i];
      }
      for (auto pair: invMapping) {
        cout << pair.second + 1;        
        if (i < N-1) {
          cout << " ";
        }
        i += 1;
      }
    }
  }  

  return 0;
}