-
백준 3015번 오아시스 재결합 (boj/3015.c)R&E: research & education/PS 2024. 1. 15. 11:16
조금 새로운 이진탐색 문제입니다.
직관적으로는 스택을 사용해서 풀 수 있지만 그렇게 풀면 시간복잡도가 N^2이 되버리므로 나락을 가버립니다.
스택에 들어가는 값이 항상 정렬되있다는 사실을 활용, 이진탐색으로 시간복잡도를 NlogN까지 올릴 수 있습니다.
#include <stdio.h> int stk[500000] = { 0, }; int srcs(int val, int sze){ int lft=0, rht=sze-1, mid; for(mid=(lft+rht)/2;lft<=rht; mid=(lft+rht)/2){ if((!mid && stk[mid]<val) || (stk[mid]<val && stk[mid-1]>=val)){ return mid; } else if(stk[mid]>= val){ lft=mid+1; } else{ rht=mid-1; } } return sze; } int srce(int val, int sze){ int lft=0, rht=sze-1, mid; for(mid=(lft+rht)/2;lft<=rht;mid=(lft+rht)/2){ if((!mid && stk[mid]<=val) || (stk[mid]<=val && stk[mid-1]>val)){ return mid; } else if(stk[mid]>val){ lft=mid+1; } else{ rht=mid-1; } } return mid; } int main(void){ int N, inp; int sze = 0; int s, e; long long cnt = 0; scanf("%d %d", &N, &inp); stk[sze++] = inp; for(int i=1;i<N;i++){ scanf("%d", &inp); if(inp < stk[sze-1]){ cnt++; stk[sze++]=inp; continue; } s = srcs(inp, sze); e = srce(inp, sze); cnt += e?sze-e+1:sze; stk[s] = inp; sze=s+1; } printf("%lld\n", cnt); return 0; }
'R&E: research & education > PS' 카테고리의 다른 글
백준 6987번 월드컵 (boj/6987.c) (0) 2024.01.23 백준 1310번 달리기 코스 (boj/1310.cpp) (1) 2024.01.22 백준 13977번 이항 계수와 쿼리 (boj/13977.c) (1) 2024.01.21 백준 1786번 찾기 (boj/1786.c) (0) 2024.01.18 백준 2618번 경찰차 (boj/2618.c) (0) 2024.01.14