본문 바로가기

알고리즘 문제 풀이/Baekjoon

1306 - 달려라 홍준

반응형
SMALL

 

 

1306번: 달려라 홍준

첫째 줄에는 뛰는 코스의 길이, 즉 칸수 N과 홍준이의 시야의 범위 M이 주어진다. 시야가 M이라고 하면 현재 위치에서 앞뒤로 M-1칸까지 광고판이 보이는 것이다. (1 ≤ M ≤ N ≤ 1,000,000) 두 번째

www.acmicpc.net

 

#include <stdio.h>

const int MAX_NUM = 1e6 + 10;
const int NODE = 1e6;

int tree[NODE * 3];

int N, M;
int sp, ep;

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

    return tree[n];
  }

  int m = (s + e) / 2;

  if (t <= m) {
    push(n * 2, s, m, t, v);
  } else {
    push(n * 2 + 1, m + 1, e, t, v);
  }

  int l = n * 2; int r = l + 1;

  tree[n] = tree[l] > tree[r] ? tree[l] : tree[r];

  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(n * 2, s, m, qs, qe);
  int r = query(n * 2 + 1, m + 1, e, qs, qe);

  return l > r ? l : r;
}

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

  for (int n = 1; n <= N; ++n) {
    int t;

    scanf("%d", &t);

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

void print() {
  sp = 1; ep = 2 * M - 1;

  while (ep <= N) {
    printf("%d ", query(1, 1, N, sp, ep));

    sp++;
    ep++;
  }
}

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

  init();

  print();

  return 0;
}

 

힙으로 푸신 사람들도 있던데,,,

 

이게 더 편하지 않나 ?

반응형
LIST

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

6236 - 용돈 관리  (2) 2023.12.22
1777 - 순열복원  (2) 2023.12.22
1715 - 카드 정렬하기  (1) 2023.12.21
14235 - 크리스마스 선물  (0) 2023.12.21
1417 - 국회의원 선거  (1) 2023.12.20