1일1알

백준 17827번 달팽이 리스트 C++ 본문

알고리즘

백준 17827번 달팽이 리스트 C++

영춘권의달인 2023. 3. 18. 11:30

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

 

17827번: 달팽이 리스트

첫째 줄에 노드의 개수 N(2 ≤ N ≤ 200,000), 질문의 횟수 M(1 ≤ M ≤ 200,000), N번 노드가 가리키는 노드의 번호 V(2 ≤ V ≤ N)가 공백으로 구분되어 주어진다. 둘째 줄에 N개의 정수 C1, C2, …, CN이 공백

www.acmicpc.net

 

한칸씩 이동하면서 탐색을 하면 무조건 시간초과가 날 것 같아서 같은 구간이 반복되는 것을 이용해서 나머지 연산을 통해 문제를 해결하였다.

 

#include <iostream>
#include <string>
#include <vector>
#include <math.h>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
#include <math.h>
#include <set>
#include <map>
#include <list>
#include <unordered_map>
#include <unordered_set>
#include <iomanip>
#include <limits.h>

using namespace std;
using int64 = long long;

vector<int> graph;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int n, m, v;
    cin >> n >> m >> v;
    int cycleLen = n - v + 1;
    graph = vector<int>(n + 1);
    for (int i = 1; i <= n; i++) cin >> graph[i];
    for (int i = 0; i < m; i++) {
        int k, index;
        cin >> k;
        if (k < n) index = k + 1;
        else {
            k = k - v + 1;
            k = k % cycleLen;
            index = k + v;
        }
        cout << graph[index] << "\n";
    }
}