백준 3020 개똥벌레
by 진혀크
문제
입력
첫째 줄에 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
나의 접근 방법
종유석과 석순의 길이를 각각의 배열에 저장해놓자. 석순을 기준으로 봤을 때 석순 높이보다 낮은 구간에는 무조건 장애물이 존재한다는 의미이며 종유석을 기준으로 보면 종유석의 길이보다 높은 구간 역시 무조건 장애물이 존재한다는 의미이다. 따라서 누적합을 적용하여 문제를 해결할 수 있다. 각각의 배열에 저장한 값을 기준으로 누적합을 구하는 과정은 다음과 같다.
코드
#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;
}
Subscribe via RSS