BAEKJOON

BAEKJOON 11003번: 최솟값 찾기

杉山空 2022. 3. 6. 23:43
728x90

https://www.acmicpc.net/problem/11003

 

11003번: 최솟값 찾기

N개의 수 A1, A2, ..., AN과 L이 주어진다. Di = Ai-L+1 ~ Ai 중의 최솟값이라고 할 때, D에 저장된 수를 출력하는 프로그램을 작성하시오. 이때, i ≤ 0 인 Ai는 무시하고 D를 구해야 한다.

www.acmicpc.net

N이 5e6이하로 매우 크다. O(N)짜리 풀이가 필요하다.

조금 생각해보면, deque을 이용해서 범위 밖에 있는 수는 없애주면 되고, 현재 수보다 큰 수는 이제 비교할 필요가 없으므로 없애주면 된다.

 

아래는 코드이다.

우선순위 큐로 푼 사람도 꽤나 있을 것 같은데, 조금만 생각해서 이 풀이대로 해결하면 코딩하는데 1분도 채 안걸린다.

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int>pii;
deque<pii>dq;
int main(){
    int N,L,A;
    scanf("%d%d",&N,&L);
    for(int i=1;i<=N;i++){
        scanf("%d",&A);
        if(i>L&&dq.front().second==i-L)dq.pop_front();
        while(!dq.empty()&&dq.back().first>A)dq.pop_back();
        dq.push_back(pii(A,i));
        printf("%d ",dq.front().first);
    }
    return 0;
}
728x90

'BAEKJOON' 카테고리의 다른 글

BAEKJOON 15480번: LCA와 쿼리  (0) 2022.06.01
BAEKJOON 1509번: 팰린드롬 분할  (0) 2022.05.08
BAEKJOON 1005번: ACM Craft  (0) 2022.03.01
BAEKJOON 1701번: Cubeditor  (0) 2022.03.01
BAEKJOON 2252번: 줄세우기  (0) 2022.03.01