본문 바로가기
알고리즘/백준 문제

22866 - 탑 보기

by HDobby 2023. 7. 21.

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

 

22866번: 탑 보기

3번째 건물에서 볼 수 있는 건물은 2, 4, 8번째 건물로 총 3개를 볼 수 있다. 그 중 3번째 건물과 가장 가까운 건물은 2, 4번째 있는 건물로 이 중 번호가 작은 번호인 2가 답이 된다.

www.acmicpc.net

주의할 점

  • 양쪽을 동시에 진행하는 건 쉽지 않습니다.
  • 왼쪽에서 오른쪽에서 각각 따로 진행 합시다.
  • 가장 가까운 거리를 구할 때 거리가 같다면 왼쪽 친구가 정답입니다.

예제

5
2 1 1 1 2





0
2 1
2 1
2 5
0

코드

#include<iostream>
#include<deque>
#include<cmath>

using namespace std;

int N;
int tower[100001];
int minn[100001][2];
deque<pair<int, int> > s;


void input(){
    cin>>N;
    for(int i=1;i<=N;++i)
        cin>>tower[i];
}

void calcFront(){
    s.clear();

    for(int i=1;i<=N;++i){
        while(!s.empty() && s.back().second <= tower[i])
            s.pop_back();

        minn[i][1] += s.size();

        if(!s.empty() && (abs(i - s.back().first) <= abs(minn[i][0] - i) || !minn[i][0]))
            minn[i][0] = s.back().first;

        s.push_back({i,tower[i]});
    }
}

void calcBack(){
    s.clear();

    for(int i=N;i>0;--i){
        while(!s.empty() && s.front().second <= tower[i])
            s.pop_front();

        minn[i][1] += s.size();

        if(!s.empty() && (abs(s.front().first - i) <= abs(minn[i][0] - i) || !minn[i][0]))
            minn[i][0] = s.front().first;

        s.push_front({i,tower[i]});
    }
}

void solution(){
    calcBack();
    calcFront();

    for(int i=1;i<=N;++i){
        if(minn[i][1] == 0)
            cout<<0<<'\n';
        else
            cout<<minn[i][1]<<" "<<minn[i][0]<<'\n';
    }
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    input();
    solution();

    return 0;
}

728x90

'알고리즘 > 백준 문제' 카테고리의 다른 글

24337 - 가희와 탑  (0) 2023.07.22
2531 - 회전 초밥  (0) 2023.07.22
2075 - N번째 큰 수  (0) 2023.07.21
14658 - 하늘에서 별똥별이 빗발친다  (0) 2023.07.20
1138 - 한 줄로 서기  (0) 2023.07.19

댓글