아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

프로그램 최적화

시간 제한2초메모리 제한256 MB

요약
주어진 C++ 프로그램을 mt19937 난수열까지 그대로 재현하고, 최대 10^7번의 구간 mex 질의를 빠르게 처리해 최종 반환값을 구한다.
난이도

어려움10점 중 8점

유형
시뮬레이션, 세그먼트 트리, 구현
정답자
아직 제출이 없습니다

문제

다음 C++ 코드를 생각하자.

#include <algorithm>
#include <random>

int query_mex(const int *a, int l, int r);

int simulate(int n, int *a, int q, int k, int s) {
  std::mt19937 gen;
  gen.seed(s);
  int last = 0;
  while (q--) {
    int op = gen() % k;
    int i = (gen() + last) % n;
    if (!op && i) {
      std::swap(a[i - 1], a[i]);
    } else {
      int j = gen() % n;
      last ^= query_mex(a, std::min(i, j), std::max(i, j));
    }
  }
  return last;
}

이 프로그램에서 query_mex(a, l, r)은 al,al+1,…,ara_l, a_{l + 1}, \dots, a_r에 등장하지 않는 최소 음이 아닌 정수를 반환한다.

nn, aa, qq, kk, ss의 값이 주어질 때, 함수가 반환하는 값을 구하자.

입력

첫째 줄에 네 정수 nn, qq, kk, ss가 주어진다. (1≤n≤2×1051 \leq n \leq 2\times 10^5, 1≤q≤1071 \leq q \leq 10^7, 1≤k≤1091 \leq k \leq 10^9, 0≤s≤1090 \leq s \leq 10^9) 둘째 줄에 nn개의 서로 다른 정수 a0,a1,…,an−1a_0, a_1, \dots, a_{n - 1}이 주어진다. (0≤ai<n0 \leq a_i < n)

출력

함수가 반환하는 값을 정수로 출력한다.

예제1

  1. 예제 1

    입력
    3 5 1 0
    0 1 2
    
    예상 출력
    3