본문 바로가기

알고리즘 문제 풀이/Baekjoon

1777 - 순열복원

반응형
SMALL

 

 

1777번: 순열복원

순열의 크기 N(1 ≤ N ≤ 100,000)이 주어진다. 두 번째 줄에는 순열 1, 2, …, N에 해당하는 Inversion sequence가 공백으로 구분되어 들어온다.

www.acmicpc.net

 

#include <stdio.h>

const int LN = 1e5 * 3;
int tree[LN];

int N, r;
int ARR[LN];
int R_ARR[LN];

int push(int n, int s, int e, int t, int v) {
  if (t < s || e < t) { return tree[n]; }
  if (s == e && t == s) {
    tree[n] = v;

    return tree[n];
  }


  int m = (s + e) / 2;

  push(n * 2, s, m, t, v);
  push(n * 2 + 1, m + 1, e, t, v);

  tree[n] = tree[n * 2] + tree[n * 2 + 1];

  return tree[n];
}

int query(int n, int s, int e, int qs, int qe) {
  if (qe < s || e < qs) { return 0; }
  if (qs <= s && e <= qe) { return tree[n]; }

  int m = (s + e) / 2;

  int l = query(2 * n, s, m, qs, qe);
  int r = query(2 * n + 1, m + 1, e, qs, qe);

  return l + r;
}

void init() {
  scanf("%d", &N);

  for (int n = 1; n <= N; ++n) {
    scanf("%d", &ARR[n]);

    push(1, 1, N, n, 1);
  }
}

void bs(int s, int e, int t) {
  if (s > e) {
    return;
  }

  int m = (s + e) / 2;
  int seg_t = query(1, 1, N, m, N) - 1;

  if (t <= seg_t) {
    r = m;
    bs(m + 1, e, t);
  } else {
    bs(s, m - 1, t);
  }
}

void print() {
  for (int n = 1; n <= N; ++n) {
    printf("%d ", R_ARR[n]);
  }
}

void cal() {
  for (int n = N; n >= 1; --n) {
    int t = ARR[n];
 
    bs(1, N, t);

    R_ARR[r]= n;

    push(1, 1, N, r, 0);
  }
}

int main(void) {
  // freopen("1777.txt", "r", stdin);

  init();

  cal();

  print();

  return 0;
}

 

아직 이진탐색 / 세그먼트 트리 더 연습해야할 듯

반응형
LIST

'알고리즘 문제 풀이 > Baekjoon' 카테고리의 다른 글

1300 - K번째 수  (1) 2023.12.23
6236 - 용돈 관리  (2) 2023.12.22
1306 - 달려라 홍준  (1) 2023.12.21
1715 - 카드 정렬하기  (1) 2023.12.21
14235 - 크리스마스 선물  (0) 2023.12.21