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

Envío 5204

Problema 0x99 - Máquina para barajar cartas

  • Autor: alejopelaez
  • Fecha: 2021-10-27 08:17:08 UTC (Hace más de 2 años)
Caso # Resultado Tiempo Memoria
#1
Correcto
0.003 s 34 KBi
#2
Incorrecto
0.005 s 15 KBi
#3
Correcto
0.004 s 32 KBi
#4
Correcto
0.004 s 16 KBi
#5
Correcto
0.003 s 20 KBi
#6
Correcto
0.813 s 28 KBi
#7
Correcto
0.809 s 27 KBi
#8
Correcto
0.006 s 0 KBi
#9
Correcto
0.005 s 9 KBi
#10
Correcto
0.005 s 17 KBi
#11
Correcto
0.004 s 11 KBi
#12
Correcto
0.027 s 3 KBi
#13
Correcto
0.047 s 3 KBi
#14
Correcto
0.025 s 1 KBi
#15
Correcto
0.05 s 3 KBi
#16
Correcto
0.069 s 3 KBi
#17
Incorrecto
0.005 s 0 KBi
#18
Incorrecto
0.005 s 1 KBi
#19
Incorrecto
0.005 s 1 KBi
#20
Incorrecto
0.005 s 0 KBi
#21
Tiempo límite excedido
1.05 s 95 KBi
#22
Error en tiempo de ejecución (NZEC)
Exited with error status 137
run: line 1:     3 Killed                  ./a.out
0.798 s 125 KBi
#23
Error en tiempo de ejecución (NZEC)
Exited with error status 137
run: line 1:     3 Killed                  ./a.out
0.764 s 125 KBi
#24
Error en tiempo de ejecución (NZEC)
Exited with error status 137
run: line 1:     3 Killed                  ./a.out
0.65 s 125 KBi
#25
Error en tiempo de ejecución (NZEC)
Exited with error status 137
run: line 1:     3 Killed                  ./a.out
0.69 s 125 KBi
Puntos totales: 60 / 100

Código

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

using Permutation = unordered_map<int64_t, int64_t>;

// Order matters, apply first p2 then p1
Permutation composition(const Permutation& p1, const Permutation& p2) {
  unordered_set<int64_t> keys;
  for (auto& pair: p1) {
    keys.insert(pair.first);
  }
  for (auto& pair: p2) {
    keys.insert(pair.first);
  }

  Permutation result;
  for (auto key: keys) {
    int64_t next = key;
    auto nextPtr = p2.find(next);
    if (nextPtr != p2.end()) {
      next = nextPtr->second;
    }

    nextPtr = p1.find(next);
    if (nextPtr != p1.end()) {
      next = nextPtr->second;
    }

    result[key] = next;
  }

  return result;
}

Permutation power(Permutation permutation, int64_t exponent) {
  if (exponent == 0) {
    return {};
  }
  if (exponent == 1) {
    return permutation;
  }    

  auto tempPerm = power(permutation, exponent / 2);
  if (exponent % 2 == 0) {
    return composition(tempPerm, tempPerm);
  } else {
    auto tempPerm2 = composition(tempPerm, tempPerm);
    return composition(tempPerm2, permutation);
  }
}

int main() {
  int N, R;

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

  Permutation permutation;
  for(int64_t i = 0; i < N; i++) {
    int num;
    cin >> num;
    permutation[i] = num;
  }

  Permutation result = power(permutation, R);
  std::vector<int64_t> final(N, 0);
  for(int64_t i = 0; i < N; i++) {
    final[result[i]] = i + 1;    
  }

  for(int64_t i = 0; i < final.size(); i++) {
    cout << final[i];
    if (i != final.size() - 1) {
      cout << " ";
    }
  }

  return 0;
}