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

Envío 5205

Problema 0x99 - Máquina para barajar cartas

  • Autor: alejopelaez
  • Fecha: 2021-10-27 08:27:12 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.005 s 3 KBi
#4
Correcto
0.004 s 0 KBi
#5
Correcto
0.004 s 1 KBi
#6
Correcto
0.74 s 28 KBi
#7
Correcto
0.766 s 27 KBi
#8
Correcto
0.005 s 0 KBi
#9
Correcto
0.004 s 2 KBi
#10
Correcto
0.004 s 1 KBi
#11
Correcto
0.004 s 0 KBi
#12
Correcto
0.034 s 2 KBi
#13
Correcto
0.045 s 3 KBi
#14
Correcto
0.013 s 1 KBi
#15
Correcto
0.069 s 4 KBi
#16
Correcto
0.095 s 3 KBi
#17
Correcto
0.005 s 2 KBi
#18
Correcto
0.004 s 1 KBi
#19
Correcto
0.006 s 0 KBi
#20
Correcto
0.004 s 0 KBi
#21
Tiempo límite excedido
1.055 s 94 KBi
#22
Error en tiempo de ejecución (NZEC)
Exited with error status 137
run: line 1:     3 Killed                  ./a.out
0.801 s 125 KBi
#23
Error en tiempo de ejecución (NZEC)
Exited with error status 137
run: line 1:     3 Killed                  ./a.out
0.657 s 125 KBi
#24
Error en tiempo de ejecución (NZEC)
Exited with error status 137
run: line 1:     3 Killed                  ./a.out
0.653 s 125 KBi
#25
Error en tiempo de ejecución (NZEC)
Exited with error status 137
run: line 1:     3 Killed                  ./a.out
0.679 s 125 KBi
Puntos totales: 80 / 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() {
  int64_t 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, -1);
  for(int64_t i = 0; i < N; i++) {
    auto res = i;

    auto nextPtr = result.find(i);
    if (nextPtr != result.end()) {
      res = nextPtr->second;
    }
    final[res] = i + 1;    
  }

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

  return 0;
}