BOJ 1168 요세푸스 문제 2

Jmnote (토론 | 기여)님의 2024년 1월 31일 (수) 16:28 판 (새 문서: ==개요== {{BOJ |단계= 45 |분류1= 자료 구조 |분류2= 세그먼트 트리 }} ==C++== <syntaxhighlight lang='cpp'> #include <bits/stdc++.h> using namespace std; int N, K; ve...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

1 개요[ | ]

BOJ 1168 요세푸스 문제 2

2 C++[ | ]

#include <bits/stdc++.h>
using namespace std;

int N, K;
vector<int> segTree;

// 세그먼트 트리 초기화
void init(int node, int start, int end) {
    if (start == end) {
        segTree[node] = 1;
        return;
    }
    int mid = (start + end) / 2;
    init(node * 2, start, mid);
    init(node * 2 + 1, mid + 1, end);
    segTree[node] = segTree[node * 2] + segTree[node * 2 + 1];
}

// K번째 사람을 찾아 제거
int query(int node, int start, int end, int k) {
    if (start == end) return start;
    int mid = (start + end) / 2;
    if (k <= segTree[node * 2]) {
        return query(node * 2, start, mid, k);
    } else {
        return query(node * 2 + 1, mid + 1, end, k - segTree[node * 2]);
    }
}

// 사람 제거 업데이트
void update(int node, int start, int end, int index) {
    if (index < start || index > end) return;
    if (start == end) {
        segTree[node] = 0;
        return;
    }
    int mid = (start + end) / 2;
    update(node * 2, start, mid, index);
    update(node * 2 + 1, mid + 1, end, index);
    segTree[node] = segTree[node * 2] + segTree[node * 2 + 1];
}

int main() {
    cin >> N >> K;
    segTree.resize(N * 4);
    init(1, 1, N);

    int current = K;
    cout << '<';
    for (int i = 0; i < N; ++i) {
        int person = query(1, 1, N, current);
        cout << person;
        if (i < N - 1) cout << ", ";
        update(1, 1, N, person);

        if (N - i - 1 > 0) current = (current + K - 1) % (N - i - 1);
        if (current == 0) current = N - i - 1;
    }
    cout << '>';
}
문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}