본문 바로가기

알고리즘 문제 풀이/Baekjoon

3006 - 터보소트

반응형
SMALL

 

 

3006번: 터보소트

첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수이며, 배열의 크기이다. 둘째 줄부터 N개의 줄에는 1보다 크거나 같고, N보다 작거나 같은 수가 중복 없이 주어진다

www.acmicpc.net

 

#include <stdio.h>

const int LN = 1e5;

int N;
int idxs[LN + 10];
int tree[LN * 3 + 10];

int seg_init(int n, int s, int e) {
  if (s == e) {
    return tree[n] = 1;
  }

  int m = (s + e) / 2;

  return tree[n] = seg_init(n * 2, s, m) + seg_init(n * 2 + 1, m + 1, e);
}

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

  int m = (s + e) / 2;

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

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

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;

  return query(n * 2, s, m, qs, qe) + query(n * 2 + 1, m + 1, e, qs, qe);
}

void init() {
  int idx;

  scanf("%d", &N);

  seg_init(1, 1, N);

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

    idxs[idx] = n;
  }
}

void cal() {
  int s = 1, e = N;
  int flag = 0, idx;

  while (s <= e) {
    if (flag++ % 2 == 0) {
      update(1, 1, N, idxs[s], 0);
      printf("%d\n", query(1, 1, N, 1, idxs[s++]));
    } else {
      update(1, 1, N, idxs[e], 0);
      printf("%d\n", query(1, 1, N, idxs[e--], N));
    }
  }
}

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

  init();

  cal();

  return 0;
}

 

쉽다 쉬워

반응형
LIST

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

1389 - 케빈 베이컨의 6단계 법칙  (0) 2023.12.27
2014 - 소수의 곱  (0) 2023.12.27
1395 - 스위치  (1) 2023.12.26
1074 - Z  (0) 2023.12.24
19646 - Random Generator  (0) 2023.12.24