알고리즘

[BOJ 22858] 원상 복구 (small)

dldyou 2024. 4. 2. 06:00

https://www.acmicpc.net/problem/22858

 

22858번: 원상 복구 (small)

$P_1, P_2, \cdots , P_N$의 수가 적혀 있는 $N$개의 카드가 있다. 1부터 N까지 수가 하나씩 존재하는 수열 $D_1, D_2, \cdots , D_i , \cdots , D_N$이 있다. 이때 각 $i$에 대해 $D_i$번째 카드를 $i$번째로 가져오는

www.acmicpc.net

규칙에 따라 섞인 수열의 맨 처음 형태를 구하면 된다.

 

$P_i$에서 $i=D_i$인 경우 $S_i$가 된다.

즉, $P[D[i]]=S[i]$이다. 이를 $K$번 반복해주면 된다. $NK\leq 10^7$이기에 전부 돌려봐도 해결 가능하다.

int N, K, S[MAXN], D[MAXN], P[MAXN];
int main(void) {
    fastio;
    cin >> N >> K;
    for (int i = 1; i <= N; i++) cin >> S[i];
    for (int i = 1; i <= N; i++) cin >> D[i];
    while (K--) {
        for (int i = 1; i <= N; i++) P[D[i]] = S[i];
        for (int i = 1; i <= N; i++) S[i] = P[i];
    }
    for (int i = 1; i <= N; i++) cout << P[i] << ' ';
    return 0;
}

'알고리즘' 카테고리의 다른 글

[BOJ 17952] 과제는 끝나지 않아!  (0) 2024.04.29
[BOJ 22862] 가장 긴 짝수 연속한 부분 수열 (large)  (1) 2024.04.02
[BOJ 11508] 2+1 세일  (0) 2024.04.01
[BOJ 9660] 돌 게임 6  (0) 2024.04.01
[BOJ 2056] 작업  (0) 2024.03.29