문제

문제 링크

입력

첫째 줄에 N과 H가 주어진다. N은 항상 짝수이다. (2 ≤ N ≤ 200,000, 2 ≤ H ≤ 500,000)

다음 N개 줄에는 장애물의 크기가 순서대로 주어진다. 장애물의 크기는 H보다 작은 양수이다.

출력

첫째 줄에 개똥벌레가 파괴해야 하는 장애물의 최솟값과 그러한 구간의 수를 공백으로 구분하여 출력한다.

예제

14 5
1
3
4
2
2
4
3
4
3
3
3
2
3
3

나의 접근 방법

종유석과 석순의 길이를 각각의 배열에 저장해놓자. 석순을 기준으로 봤을 때 석순 높이보다 낮은 구간에는 무조건 장애물이 존재한다는 의미이며 종유석을 기준으로 보면 종유석의 길이보다 높은 구간 역시 무조건 장애물이 존재한다는 의미이다. 따라서 누적합을 적용하여 문제를 해결할 수 있다. 각각의 배열에 저장한 값을 기준으로 누적합을 구하는 과정은 다음과 같다.
solution

코드

#include<iostream>
#include<vector>
using namespace std;
int main(void){
  ios_base :: sync_with_stdio(false);
  cin.tie(NULL);
  int N, H, min = 300000, count = 0;
  cin>>N>>H;
  vector<int> bottom(H+1, 0), top(H+1, 0);
  for(int i = 0 ; i<N ; i++){
    int input;
    cin>>input;
    if(i % 2 == 0) {
      bottom[input]++;
    }
    else {
      top[H+1-input]++;
    }
  }
  for(int i = 1 ; i<=H ; i++){
    top[i] += top[i-1];
    bottom[H-i] += bottom[H+1-i];
  }
  for(int i = 1 ; i<=H ; i++){
    if(min > top[i] + bottom[i]){
      min = top[i] + bottom[i];
      count = 1;
    }
    else if(min == top[i] + bottom[i]) count++;
  }
  cout<<min<<" "<<count;
  return 0;
}