BOJ 28301 - 은하 온라인 마케팅 프로젝트

image.png

중간까지는 관찰을 하고 그럴듯한 풀이를 짰지만 놓친게있었다.

다음 풀이는 에디토리얼을 공부하며 정리한 풀이이다.


어떤 정답이 되는 도시 조합은 도시들 중 가장 큰 값이 a[i][j]a[i][j]에 존재한다.

또한, 어떤 도시 조합에서 t (0tC)t\ (0 \le t \le C) 명이 더 오는 이벤트를 열어야 하는 도시는 가장 작은 도시이다.

왜냐면 어차피 tt 값은 하나의 도시에만 이벤트를 열 수 있고, 가장 작은 도시에 이벤트를 열어야 최대 도시와 가장 작은 도시의 차가 줄어들 가능성이 가장 크기 때문이다.

따라서 처음에 a[i]a[i] 를 모두 오름차순 정렬하고(중복도 제거해도 된다) 각 국가에서 가장 큰 도시들만 뽑아와서 도시 조합을 만들고,

거기서 가장 큰 값이 cc라고 하면 cc들을 모두 빼고 빼진 국가들은 그 다음 작은 a[i][j]a[i][j] 값들을 넣어주는 것을 반복하고 이것이 불가능할 때 까지 반복하는 것으로 모든 도시 조합을 순회할 수 있다.

이제 이 도시 조합에서 가장 작은값을 aa, 그 다음으로 작은 값을 bb, 가장 큰 값을 cc, 합을 ss 라고 하자.

aa에 이벤트를 열어 a=a+ta'=a+t 라고 할 때, tt 가 뭐냐에 따라 가장 큰 도시와 가장 작은 도시의 차가 달라진다.

이 도시 조합에 tt 가 정해졌을 때 불균등도를 f(t)f(t) 라 하면 다음과 같은 세 가지 상황이 나온다.

$$ f(t)=\begin{cases} c-(a+t) & \ \text{if}\ a+t

a+ta+tbb보다 작은 경우, b,cb,c 사이에 끼인 경우, cc보다 커지는 경우를 각각 생각하면 된다.

여기서부터 어렵다.

우리가 어떤 도시 조합에 대해 PP가 있을 때, ttf(t)f(t) 의 최소값이 나오게 되는 경우는 다음과 같이 두 개이다.

PsP-s 라는 값에 주목해보면 이는 이 도시조합에서 tt로 써야 하는 최소값이다.

PscaP-s \le c-a 라면 t=Min(C,ba)t=\text{Min}(C, b-a) 일 때 f(t)f(t)의 최소가 나온다.

이는 Pca+sP \le c-a+s 일 때로 다시 표현할 수 있다.

두 번째로

ca<PsCc-a < P-s \le C 인 상황은 t=Pst=P-s 일 때 f(t)f(t) 의 최소값이 나온다.

첫 번째 경우는 aa'cc 를 넘지 않아도 될 때 최대한 aa'bbcc 사이에 넣어주는 방법이고, 두 번째 경우는 a=a+ta'=a+tcc를 넘기 때문에 최소로 추가해줘야 할 것만 추가해주는 방법이기 때문에 위와 같은 식이 도출된다.

결론적으로 어떤 도시 조합이 커버할 수 있는 PP의 구간은 결국 [s,s+C][s, s+C] 이기 때문에,

이 구간에 대해서 f(t)f(t) 가 최소가 될 수 있는 구간은 다음과 같이 나뉜다.

PP 값을 xx 라고하고 최소 불균등도를 yy라고 할 때,

y={f(Min(C,ba)) if sxMin(s+C,ca+s)f(xs) if ca+s<xs+C y=\begin{cases} f(\text{Min}(C, b-a)) & \ \text{if}\ s \le x \le \text{Min}(s+C, c-a+s) \\ f(x-s) & \ \text{if}\ c-a+s < x \le s+C \end{cases}

식에서 위에것은 xx와 관계없기 때문에 PP 를 내림차순으로 정렬하고 순회하며

Min(s+C,ca+s)\text{Min}(s+C, c-a+s) 에 대해 어떤 도시조합 에서 f(Min(C,ba))f(\text{Min}(C, b-a)) 가 가능해졌다고 체크해주고 지금까지 사용가능해진 것 중 최소값을 정답으로 사용해주면 검사가 가능하다.

아래것은 그러지 못한다.

다음과 같은 관찰을 한다.

임의의 PP값에서 yy값이 P(ca+s)+f(ca)P-(c-a+s)+f(c-a) 이므로 PP 를 제외하고 봤을 때 어떤 가능한 도시 조합들 중 ca+sf(ca)c-a+s-f(c-a) 가 최대값이 되는 값을 선택해서 PP 에서 빼준 것이 최소가 된다.

이 값을 KK 라고 하면 (ca+s,K,+1)(c-a+s, K, +1)(s+C,K,1)(s+C,K,-1) 처럼 이벤트를 구성하여 PP 를 오름차순으로 순회하며 현재 가능한 것들만 multiset 같은 곳에 넣어서 관리하는 방식으로 두 번째 정답 후보들을 순회할 수 있다.

Tags:

Categories:

Updated:

Comments